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