关于java字符串文字池和字符串';s串联
全部,, 我在写下面的代码时遇到了一个问题关于java字符串文字池和字符串';s串联,java,string,Java,String,全部,, 我在写下面的代码时遇到了一个问题 String hello = "Hello"; String str5 = "Hel" + "lo"; String str8 = "Hel"; String str9 = "lo"; String str10 = str8 + str9; System.out.println("str10==hello?" + (str10 == hello)); System.out.println("str5==hello?" + (str5 == hello
String hello = "Hello";
String str5 = "Hel" + "lo";
String str8 = "Hel";
String str9 = "lo";
String str10 = str8 + str9;
System.out.println("str10==hello?" + (str10 == hello));
System.out.println("str5==hello?" + (str5 == hello));
System.out.println("str10==str5?" + (str10 == str5));
然后我运行我的代码,控制台打印这个
str10 == hello ? false
str5 == hello ? true
str10 == str5 ? false
这让我很困惑。为什么第二次打印为真而第一次打印为假??
在我对字符串文字池的理解中,当一个字符串被定义时,JVM将检查该池是否包含该字符串,如果不包含,则将该字符串放入该池。在我的代码中,变量hello存在于字符串池中,Helo”和“lo”也存在于该池中,我的问题是
我的IDE:Intellij Idea 11.2
任何人都可以指出这一点吗?非常感谢你它的表现应该是这样的。JLS的两个部分对此进行了讨论 : 作为常量表达式(§15.28)值的字符串被“插入”,以便使用String.intern方法共享唯一实例 列出被视为常量表达式的内容。特别是,字符串文字是常量表达式(“Hel”和“lo”),但要将变量视为常量,它必须是最终的 在您的情况下,如果您稍微更改代码以使
str8
和str9
保持不变,您将得到true
三次:
final String str8 = "Hel";
final String str9 = "lo";
如果比较两个字符串,请使用
string.equals
notstring1==string2
试试看:
System.out.println("str10==hello?" + (str10.equals(hello));
该准则有以下几点需要考虑:
String hello = "Hello";
这里“Hello”是一个分配给reference Hello的文本,因此该文本有自己的hashcode
String str5 = "Hel" + "lo";
String str10 = str8 + str9;
System.out.println("str10==hello?" + (str10 == hello));
System.out.println("str5==hello?" + (str5 == hello));
System.out.println("str10==str5?" + (str10 == str5));
这里的“Hel”+“lo”是两个字面值的组合,并分配给reference hello,因此新字面值与第一个字面值相同,因此哈希代码相同
String str8 = "Hel";
String str9 = "lo";
这里str8+str9是两个引用,它们组合并指向一个新的引用hello,因此新的文本有自己的hashcode
String str5 = "Hel" + "lo";
String str10 = str8 + str9;
System.out.println("str10==hello?" + (str10 == hello));
System.out.println("str5==hello?" + (str5 == hello));
System.out.println("str10==str5?" + (str10 == str5));
当您使用==时,它通过哈希代码和值匹配。因此不匹配
尝试使用
字符串_1.等于(字符串_2)
而不是
字符串_1==字符串_2
你只会得到值匹配,所以都是真的
请同时参考以下答案(来源):
equals()方法比较字符串实例(堆上)内的“值”,而不管这两(2)个对象引用是否引用同一个字符串实例。如果任何两(2)个String类型的对象引用引用引用同一个字符串实例,那就太好了!如果这两(2)个对象引用引用引用引用了两(2)个不同的字符串实例..没有区别。它是每个要比较的字符串实例中的“值”(即:字符数组的内容)
另一方面,“==”运算符比较两个对象引用的值,以查看它们是否引用同一个字符串实例。如果两个对象引用的值“引用”同一个字符串实例,则布尔表达式的结果将为“true”。.duh.另一方面,如果两个对象引用的值“引用”“不同的字符串实例(即使两个字符串实例具有相同的“值”,即每个字符串实例的字符数组的内容相同),布尔表达式的结果将是“false”。很抱歉,我不理解“use==它通过哈希代码和值匹配”,
我打印了str5、str8、str5的每个哈希代码,str9,str10是你好。hash->69609650;str8.hash->72431;str9.hash->3459;str10.hash->69609650;str5.hash->69609650;我们可以看到,str5的hashcode,str10的代码完全相同,但是str5==str10返回false;谢谢你花时间写这篇文章。这解决了我对“==”和“equals”的混淆。非常感谢。是的,正如我们在字符串equals源代码中看到的,首先检查(this==anObject){return true;},然后判断它是否是字符串的实例,如果是,比较两个字符串对象的内容。