们看一下内存结构
3. 再次赋值给已定义的字符串
str6 = "helloHuaxia";
我们开始已经说了String是由final关键字修饰,不可变,那么此时在内存中如何体现呢?
4. String 对 “+” 的处理
String str7 = "good good" + " study";
String str8 = "good good study";
system.out.println(str7 == str8);
通过编译工具后得到
String str7 = "good good study";
String str8 = "good good study";
因此我们可以发现编译器在编译期间就是进行变量合并,而不会在常量池中创建三个对象 “good good”,“ study”,"good good study"。str7 == str8 运行结果 true。
但如果这样
String str9 = "good good ";
String str10 = str9 + "study";
system.out.println(str8 == str10);//false
这时运行结果为false,通过String变量 + 字符常量方式得到的结果会在堆中,不在常量池中,当然可以通过intern()方法放进常量池中,同时不仅“+”如此,调用substring(),toUpperCase(),trim()等返回的都是String在堆中的地址。
5. String常用的方法
//str1 == "hello,world ";
//获取长度
str1.length()//12;
//截取位置2到5之间的字符串(包括位置2,不包括位置5,从0开始)
str1.substring(2,5);//"llo"
//判断是否含有字符串“ello”
str1.contains("ello");//true,通过indexOf实现
//获取ello在str1中的开始位置
str1.indexOf("ello");//1
//将字符串转化为字符串数据
str1.split(",");//["hello","world"]
//去掉字符串两侧空格
str1.trim();//"hello,world"
二. 总结
本文从String的不可变性,String创建时字面量和String对象的不同,字符串字面量常量池,字符串的内存结构,常用的String相关方法的描述,若有不对之处,请批评指正,望共同进步,谢谢!