在我们继续之前: 我知道我们应该使用.equals()来比较内容.我现在只是谈论以下场景中的实际参考是否相同...
假设我们有以下内容:
String str1 = "str";
String str2 = "string";
String str3 = "ing";
String str4 = str1 + str3;
str1 = str4;
String str5 = "string";
System.out.println(str1==str2);//false
Run Code Online (Sandbox Code Playgroud)
我认为它应该是真的,因为在String池中,对"string"的引用应该是相同的,因为str1和str2现在都是"string".它应该是真的,但最终是假的.
System.out.println(str1.intern()==str2.intern());//true
Run Code Online (Sandbox Code Playgroud)
我试过这个,这次回归真实.然后我尝试了:
System.out.println(str1==str5);//false
System.out.println(str2==str5);//true
Run Code Online (Sandbox Code Playgroud)
还 的System.out.println( "STR" + "ing"的== "串"); //真
是不是应该来自String池?有人可以帮忙解释一下吗?
保证只汇集字符串文字和常量表达式.由于str1 + str2不是文字,因此无论结果是否被实现,都取决于JVM.您可以通过调用强制它,intern()因为您已经发现了.
字符串文字是对类实例的引用
String(§4.3.1,§4.3.3).而且,字符串文字总是指同一个类的实例
String.这是因为字符串文字 - 或者更常见的是作为常量表达式(第15.28节)的值的字符串 - 被"实现"以便使用该方法共享唯一实例String.intern.
您的第二个示例"str" + "ing"是一个常量表达式,因此可以保证实习.
另请参阅JavaDocString.intern.
这是试图解释发生了什么.编写良好的代码应该永远不会依赖于此,但始终使用该equals方法.任何合理的JRE都会有一个支票
if (this == other)
return true;
Run Code Online (Sandbox Code Playgroud)
非常接近顶级的String.equals表现明智,应该没关系.