String不可变:在内存(堆)中创建了一个字符串之后,它不能被改变,对字符串的操作方法都是新创建了一个字符串,原字符串不变

需要可变字符串,一般使用StringBuffer(线程安全)、StringBuilder(速度快),减少系统垃圾回收的资源损耗

 

String方法:

substring(int beginIndex, int endIndex)截取字符串并返回其[beginIndex,endIndex-1]范围内的内容

String类包含三个成员变量:char value[],int offset,int count

jdk6中,会创建新的字符串,但是这个string仍指向同一个value,只有offset和count不同,容易导致性能问题

jdk7中,对substring进行了优化,会创建一个新的数组

 

replace不使用正则表达式,replaceAll、replaceFirst使用正则表达式,replaceFirst替换第一个

String s = "my.test.txt";
System.out.println(s.replace(".""#")); // my#test#txt
System.out.println(s.replaceAll(".""#")); // ###########
System.out.println(s.replaceFirst(".""#")); // #y.test.txt

 

String 对“+”的重载,在代码执行时引入StringBuilder类,调用append方法进行字符串拼接,最终通过toString 返回结果

字符串拼接方式:直接+,concat()方法,append()方法等

 

String.valueOf()实际是调用了包装类的toString方法

jdk7中新增了switch对string的支持

 

String常量池

因为String是不可变的,为提升效率,引入了字符串池的概念

String s3 = "a" + "b"; //"a"是常量,"b"是常量,常量+常量=常量,所以会入池.

String s4 = s1 + "b";   //s1是变量,"b"是常量,变量+常量!=常量,所以不会入池.

入池之后,会先查找池中有无此对象,如果有,则对象引用指向此对象;如果无,则先创建此对象,再让对象引用指向此对象

存在于.class文件中的常量池,在运行期被JVM装载,并且是可以扩充的

intern()方法是一个可以扩充常量池的方法,当String实例调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用

String s0= "kvill";  
String s1=new String("kvill");  
String s2=new String("kvill");  
System.out.println(s0==s1);  //false
System.out.println("**********");  
s1.intern();  
s2=s2.intern(); //把常量池中“kvill”的引用赋给s2  
System.out.println( s0==s1);  //false  s1.intern()返回值未赋值给s1
System.out.println( s0==s1.intern() );  //true
System.out.println( s0==s2 );  //true
posted on 2019-03-08 17:43  MC伍  阅读(167)  评论(0编辑  收藏  举报