String中字符串==分析
String中字符串==分析
new String
new String都是在堆上创建字符串对象。
intern()
调用intern()方法时,编译器会将字符串添加到常量池中(StringTable维护),并返回指向该常量的引用。
String str2 = new String("str")+new String("01");
str2.intern(); //将常量池中的引用地址返回给str2
String str1 = "str01";
System.out.println(str2==str1); //返回为true
String str2 = new String("str")+new String("01");
String str1 = "str01";
str2.intern(); //可以这里理解,当字符串常量池中已经有了str01字符串,那么此条没有做什么操作
System.out.println(str2==str1); //返回false
通过字面量赋值
如:String str = "twn";时,会先在常量池中查找是否存在相同的字符串,若存在,则将栈中的引用直接指向该字符串;若不存在,则在常量池中生成一个字符串,再将栈中的引用指向该字符串。
常量字符串 “+”
常量字符串的 “+”操作,编译阶段直接会合成为一个字符串。如string str=”JA”+”VA”,在编译阶段会直接合并成语句String str=”JAVA”,于是会去常量池中查找是否存在”JAVA”,从而进行创建或引用。
对于final字段
对于final字段,编译期直接进行了常量替换(而对于非final字段则是在运行期进行赋值处理的)。
final String str1=”ja”;
final String str2=”va”;
String str3=str1+str2;
在编译时,直接替换成了String str3=”ja”+”va”,根据上面的规则,再次替换成String str3=”JAVA”
变量和常量字符串拼接
常量字符串和变量拼接时(如:String str3=baseStr + “01”;)会调用stringBuilder.append()在堆上创建新的对象。
参考博客
几张图轻松理解String.intern():https://blog.csdn.net/soonfly/article/details/70147205