How ==返回false,即使两个字符串s1和s3具有相同的哈希码


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,即使s1s3具有相同的哈希码?

尽管上面有评论,我怀疑你已经理解了==确定两个引用是否指向同一个对象(或者都是null),如果你想比较两个字符串是否数据相等,你应该使用equals()

相反,我认为你遗漏的是hashCode()方法在这方面对应于equals()方法;它基于对象中的数据,事实上,它指定类应该始终以这样的方式实现hashCode(),即如果a.equals(b),则a.hashCode() == b.hashCode()。(当然,语言中没有强制执行这一点。)您正在寻找的==的类似物是System.identityHashCode()方法。

然而,即使在那里,也应该注意System.identityHashCode()并不能保证不同的实例将具有不同的身份哈希码。(它不能,因为在JVM中可能同时有超过2个32个对象…当然,并不是所有的jvm都支持;但是Java语言规范中并没有禁止它)

equalshashCode的正确实现中,您对两个对象ab(不是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"在它的池中。==比较引用。这就是为什么你得到错误的结果。

相关内容

最新更新