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

原文地址:https://www.cnblogs.com/liuligang/p/10619502.html