java基础知识---String
Posted udbyygysai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java基础知识---String相关的知识,希望对你有一定的参考价值。
一、字符串的不可变性
先看一段代码
1 package reverse; 2 3 public class Reverse { 4 public static void main(String[] args) 5 { 6 String c1=new String("abc"); 7 String c2=new String("abc"); 8 String c3=c1; 9 System.out.println("c1==c2:"+ (c1==c2)); 10 System.out.println("c1.equals(c2):"+c1.equals(c2)); 11 System.out.println("c3==c1:"+(c3==c1)); 12 System.out.println("c1.equals(c3):"+c1.equals(c3)); 13 c1="han"; 14 System.out.println(c1+" "+c3); 15 System.out.println(""+(c3==c1)); 16 } 17 }
第一个输出语句c1==c2很好理解,因为c1和c2都是用new 创建的对象的引用,虽然对象的值相同,但两个对象在不同的内存空间,也就是说c1和c2是对两个不同的对象的引用,所以结果为false。第二个输出语句c1.equals(c2)是调用了String类的equals方法,该方法用于比较两个字符串对象的值是否相等,所以结果为true。
c1、c2变量在内存中的模拟:
对于c3==c1为true是因为将c1赋值给了c3 也就是将c1对象的引用赋值给了c3;c1和c3在内存中的模拟:
对于System.out.println(c1+" "+c3),这个输出语句有人会问既然c1和c3引用的是同一个对象,为什么改变c1的值c3的值并不会改变呢?
这就涉及到了Java中String对象的不可变性,什么叫不可变性呢,简单的说就是一旦一个String对象被创建并被赋值(初始化)这个对象的值就不会变化。
一旦一个String对象在内存中创建,它将是不可改变的,所有的String类中方法并不是改变String对象自己,而是重新创建一个新的String对象。
也就是说c1=han,并不是改变了原有对象的值,而是创建了一个新的字符串对象,这个对象的值是han,并把这个对象的引用赋值给了c1。
此时c1 和c3在内存中的模拟:
所以此时c1==c3 为false
正因为String对象的不可变性,如果需要对字符串进行大量的修改、添加字符、删除字符等操作尽量不要使用String对象,因为这样会频繁的创建新的对象导致程序的执行效率下降
这时我们可以使用字符串生成器StringBuilder。
二、substring
String是Java中一个比较基础的类,每一个开发人员都会经常接触到。而且,String也是面试中经常会考的知识点。String有很多方法,有些方法比较常用,有些方法不太常用。今天要介绍的subString就是一个比较常用的方法,而且围绕subString也有很多面试题。
substring(int beginIndex, int endIndex)
方法在不同版本的JDK中的实现是不同的。了解他们的区别可以帮助你更好的使用他。为简单起见,后文中用substring()
代表substring(int beginIndex, int endIndex)
方法。
substring() 的作用
substring(int beginIndex, int endIndex)
方法截取字符串并返回其[beginIndex,endIndex-1]范围内的内容。
String x = "abcdef";
x = x.substring(1,3);
System.out.println(x);
输出内容:bc
三、replaceFirst、replaceAll、replace 区别
1、replace()
String str= "mesquite in your cellar"
str.replace(‘e‘, ‘o‘)
returns "mosquito in your collar"
由此可知replace是全替换的。
建议:单引号全部改为双引号,避免编译出错,有时可能操作多字符。
2、replaceFirst()、replaceAll()
(1)用法与replace相同,但是后面两者基于规则表达式的替换;
(2)replaceFirst只替换第一次出现的,后面就不管了;
(3)replaceAll是replace的加强版。
(4)替换数字时的格式:"\\d"、也可以单换一个数字。
注意:执行了替换操作后,源字符串的内容是没有发生改变的.
四、 String.valueOf 和 Integer.toString 的区别
interger.toString()方法
作用:该方法返回指定整数的有符号位的String对象,以10进制字符串形式返回。
内部实现:
1 public static String toString(int i) { 2 if (i == Integer.MIN_VALUE) //等于最小值直接返回最小值字符串,避免getChars方法遇到最小值发生错误 3 return "-2147483648"; 4 //判断i的位数,若位负数增加1位用来保存符号位 5 int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i); 6 char[] buf = new char[size]; 7 //将i转换位buf符号数组 8 getChars(i, size, buf); 9 //因为buf数组是在方法内部生成,其他地方不会有其引用,所以直接将其引用给String内部的value保存,用来初始化String 10 return new String(buf, true); 11 }
可以看出Integer.toString()方法用来执行将int转换为String的操作,那么根据方法复用的原则,可以推断出String.toString(int)也应该是使用来该方法。那么我们接着往下看。
String.valueOf()方法
不同于Integer.toString(int),valueof有大量的重载方法,我们一一对其介绍。
public static String valueOf(Object obj)
作用:将对象转换成String类型
源码:
1 public static String valueOf(Object obj) { 2 return (obj == null) ? "null" : obj.toString(); 3 }
可以看出这里调用对象的toString(),所以写对象时,最好重写其toString()方法。
public static String valueOf(char data[])
作用:将字符数组转换成String类型
源码:
1 public static String valueOf(char data[]) { 2 return new String(data); 3 }
直接将字符数组作为String的构造参数入参,内部是将数组复制了一份保存在了String中,用来初始化String。
public static String valueOf(char data[], int offset, int count)
作用:将offset位置至offset+count位置的data[]数组转换成String类型
源码:
1 public static String valueOf(char data[], int offset, int count) { 2 return new String(data, offset, count); 3 }
public static String valueOf(boolean b)
作用:将布尔转换成String类型
源码:
1 public static String valueOf(boolean b) { 2 return b ? "true" : "false"; 3 }
可以看出并不能直接从boolean转换成字符,而是判断后,返回指定的字符串。
public static String valueOf(char c)
作用:将字符转换成String类型
源码:
1 public static String valueOf(char c) { 2 char data[] = {c}; 3 return new String(data, true); 4 }
这里先将字符转换成字符数组,可能好奇String(data,true)这个构造方法与上面的String(data)有什么不同,String(data, true)构造方法将引用传递给了String内部的value用来创建字符串,data在方法内部创建没有其他引用,所以可以直接传递,节约内存空间。
public static String valueOf(int i)
作用:将int类型转换成String类型
源码:
1 public static String valueOf(int i) { 2 return Integer.toString(i); 3 }
与我们的推测相似,这里调用了Integer.toString()的方法,可以看出String的valueof方法是将各种类型转换成String,内部重载了不同类型转String的处理,所以推荐使用valueof方法。
public static String valueOf(long l)
作用:将long类型转换成String类型
源码:
1 public static String valueOf(long l) { 2 return Long.toString(l); 3 }
public static String valueOf(float f)
作用:将float类型转换成String类型
源码:
1 public static String valueOf(float f) { 2 return Float.toString(f); 3 }
public static String valueOf(double d)
作用:将double类型转换成String类型
源码:
public static String valueOf(double d) { return Double.toString(d); }
以上是关于java基础知识---String的主要内容,如果未能解决你的问题,请参考以下文章
Failed to convert property value of type ‘java.lang.String‘ to required type ‘int‘ for property(代码片段
11.按要求编写Java应用程序。 创建一个叫做机动车的类: 属性:车牌号(String),车速(int),载重量(double) 功能:加速(车速自增)减速(车速自减)修改车牌号,查询车的(代码片段
按要求编写Java应用程序。 创建一个叫做机动车的类: 属性:车牌号(String),车速(int),载重量(double) 功能:加速(车速自增)减速(车速自减)修改车牌号,查询车的载重量(代码片段