参考博文:https://blog.csdn.net/qq_34490018/article/details/82110578
1.String类是使用了final修饰,内置char[] 也是使用了fianl修饰,当你改变String的时候,通常会重新new一个对象,String实例的值是通过字符数组实现字符串存储的。
2.什么时候创建呢,一般都是先查找字符串常量池有没有该对象,有的话直接将常量池对象的内存地址引用过来(也就是没有新建对象),没有则创建新的地址,并存到常量池里.
举例子:
-
+拼接字符串 编译期就已经拼接了
String a=“a”+“b”+“c”+“d” ;创建了几个对象? //0个或者1个对象
右边是"+“号拼接,而且都是常量不是对象引用,编译时相当于拼接了"abcd”,
接着才去运行时常量池查找对象地址是否存在,有的话直接引用地址,没有就创建一个.
等价: String a=new StringBuilder(“abcd”);
//常量池查找"abcd" -
new对象
String b=new String(“abcd”);
这里 可以拆分两步,等价于 String a=“abcd”; String b=new String(a);
那么,常量池没有"abcd" 就会创建一个, 之后new一个,一共2个对象;
public class Test {
public static void main(String[] args) {
String a="a"+"b"+"c"+"d";
String b=new String(a);
String c="abcd";
System.out.println(a==b); //false
System.out.println(a==c); //true
}
}
-
混合使用,假设常量池不存在 13,1,14,1314
String a=”1”+”3”+new String(“1”)+”4”;
相当于 String n1=“13”,String n2=“4”; //创建2个对象,13和4
String a=n1+new String(“1”)+n2; //new创建了2个, 里面的对象是个String
String a=“1314” ; //1314拼接后又创建1个
一共是4个对象 -
new+new
String a=new String(“1”)+new String(“1”);
相当于, 创建了对象 String n=“1”; //创建一个"1"
String a=new String(n)+new String(n); //new了两个对象
//最后拼接了 “11” 创建一个
//一共四个对象
ps:JDK6中的常量池是放在永久代的,永久代和Java堆是两个完全分开的区域