String创建于字符串常量池

72 阅读1分钟

new String()

如果常量池没有,创建两个String 一个char[] 。两个String指向char[]后一个返回,一个封装成HashtableEntry 放入常量池。

如果常量池有,创建一个String指向char[]

String xx = ''xxx''

如果常量池有直接指向常量池原本的String

没有的话创建一个char[],一个String指向char[],封装成HashtablEntry且返回String

两个String拼接,调用StringBuilder的append和toString

复制一份char[],创建一个String指向char[],不存入常量池

String s1 = new String("xyz");
String s2 = "xyz";
System.out.println(s1 == s2);//false
System.out.println(s1.equals(s2));//true  底层指的是同一个char[]
String s1 = "aa";
String s2 = "bb";
String str1 = s1 + s2;
String str2 = "aabb";
System.out.println(str1 == str2);//false
​
final String s3 = "cc";
final String s4 = "dd";
String str3 = s3 + s4;
String str4 = "ccdd";
System.out.println(str3 == str4);//true
//用final修饰后,JDK的编译器会识别优化,会把 String str3 = s3 + s4; 优化成String str3 = "ccdd" 。

image.png

image.png

image.png

image.png 使用intern可以让拼接后加入常量池

image.png

image.png

图片来源(侵删):zhuanlan.zhihu.com/p/346702958