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 = =>> 假
=================================
谁能解释为什么==返回false,即使s1和s3具有相同的哈希码?
尽管上面有评论,我怀疑你已经理解了==
确定两个引用是否指向同一个对象(或者都是null),如果你想比较两个字符串是否数据相等,你应该使用equals()
。
相反,我认为你遗漏的是hashCode()
方法在这方面对应于equals()
方法;它基于对象中的数据,事实上,它指定类应该始终以这样的方式实现hashCode()
,即如果a.equals(b)
,则a.hashCode() == b.hashCode()
。(当然,语言中没有强制执行这一点。)您正在寻找的==
的类似物是System.identityHashCode()
方法。
System.identityHashCode()
并不能保证不同的实例将具有不同的身份哈希码。(它不能,因为在JVM中可能同时有超过2个32个对象…当然,并不是所有的jvm都支持;但是Java语言规范中并没有禁止它)
在equals
和hashCode
的正确实现中,您对两个对象a
和b
(不是null
)有以下含义:
如果a == b
,则a.equals(b)
如果a.equals(b)
,则a.hashCode() == b.hashCode()
对于两个对象,==操作符比较它们的指针引用。所以除非它们是完全相同的对象否则这是不成立的
当你这样做的时候:
String a = "xyz"
在创建字符串时,JVM在字符串池中搜索是否已经存在字符串值xyz
,如果存在,'a'将只是该字符串的引用,并且不会创建新的string对象。
但是如果你说:
String a = new String("xyz")
强制JVM创建一个新的String引用,即使"xyz"在它的池中。==
比较引用。这就是为什么你得到错误的结果。