PFB我试图理解的一段代码。
public static void main(String[] args) {
String s1 = "dexter7";
String s2 = "dexter" + "7";
System.out.println(s1==s2); //line 1 - Output is true
String s3 = "dexter" + s1.length();
System.out.println(s1==s3); //line 2 - Output is false
}
根据字符串常量池的概念,如果常量池中存在String值,则将重用它,而不是创建新的String,除非“new”关键字在图片中。
那么为什么考虑到第1行和第1行的输出,上述片段中的这种行为会发生变化?第2行标记在上面的代码段中。
任何人都可以帮助我理解这一点。
感谢。
答案 0 :(得分:1)
s1.length()
不是在编译时评估,而是在运行时评估
String s3 = "dexter" + s1.length();
将编译成
String s3 = new StringBuilder("dexter").append(s1.length()).toString();
和toString
将在内部使用new String(...)
来创建s3
,因此它不会来自字符串池。
另一方面
String s2 = "dexter" + "7";
由编译器连接并编译成
String s2 = "dexter7";
所以s2
与s1
的字符串文字相同。