public static void main(String[] args) {
String str1 = "java";
String str2 = str1.intern();
String str3 = new String(str1.intern());
System.out.println("hash1=" + str1.hashCode());
System.out.println("hash2=" + str2.hashCode());
System.out.println("hash3=" + str3.hashCode());
System.out.println("str1==str2==>>" + (str1 == str2));
System.out.println("str1==str3==>>" + (str1 == str3));
}
============================================输出== =>
HASH1 = 3254818
HASH2 = 3254818
hash3 = 3254818
STR1 == STR2 ==>>的真
STR1 == STR3 ==>>的假
=================================
有人可以解释==如果 s1 和 s3 相同哈希码,= =返回 false ?
答案 0 :(得分:3)
尽管有上述评论,我怀疑你已经明白==
确定两个引用是否指向同一个对象(或者都是null),如果你想要的话,你应该使用equals()
比较两个字符串的数据相等性。
相反,我认为您遗漏的是hashCode()
方法在这方面与equals()
方法相对应;它基于对象中的数据,事实上,它指定类应始终以hashCode()
,然后a.equals(b)
的方式实现a.hashCode() == b.hashCode()
。 (当然,语言中没有任何内容可以强制执行此操作。)您正在寻找==
的类似物the System.identityHashCode()
method。
但是,即使在那里,也应该注意System.identityHashCode()
不保证不同的实例将具有不同的身份哈希码。 (它不能,因为它可能同时在JVM中有超过2个 32 对象...被授予,并非所有JVM都支持它;但Java语言规范中没有任何内容禁止它。)
答案 1 :(得分:1)
在equals
和hashCode
的正确实施中,您对两个对象a
和b
(不是null
)有以下含义:< / p>
如果a == b
,那么a.equals(b)
如果a.equals(b)
,那么a.hashCode() == b.hashCode()
这两种影响一般都无法逆转。
答案 2 :(得分:-1)
对于两个对象,==运算符比较它们的指针引用。因此,除非它们实际上是完全相同的对象,否则它永远不会成真。
答案 3 :(得分:-1)
当你这样做时:
String a = "xyz"
在创建字符串时,如果已经存在字符串值xyz
,JVM将在字符串池中搜索,如果是,则&#39; a&#39;将只是该字符串的引用,并且不会创建新的String对象。
但如果你说:
String a = new String("xyz")
你强制JVM创建一个新的String引用,即使&#34; xyz&#34;在它的游泳池。
和==
比较参考文献。这就是你得到错误结果的原因。