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

时间:2016-11-08 06:01:45

标签: java string

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

4 个答案:

答案 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)

equalshashCode的正确实施中,您对两个对象ab(不是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;在它的游泳池。 和==比较参考文献。这就是你得到错误结果的原因。