java hashCode疑惑

标签 java hashcode

我有这个程序:

import java.util.*;
public class test {
    private String s;
    public test(String s) { this.s = s; }
    public static void main(String[] args) {
        HashSet<Object> hs = new HashSet<Object>();
        test ws1 = new test("foo");
        test ws2 = new test("foo");
        String s1 = new String("foo");
        String s2 = new String("foo");
        hs.add(ws1); 
        hs.add(ws2); 
        hs.add(s1); 
        hs.add(s2); // removing this line also gives same output.
        System.out.println(hs.size()); 
    } 
}

请注意,这不是作业。我们今天早些时候在测验中被问到这个问题。我知道答案,但试图理解为什么会这样。

上面的程序给出了 3 作为输出。

谁能解释一下这是为什么?

我认为(不确定):

java.lang.String 类覆盖了 java.lang.Object 中的 hashCode 方法。因此,值为“foo”的 String 对象将被视为重复项。测试类没有覆盖 hashCode 方法并最终使用 java.lang.Object 版本并且这个版本总是为每个对象返回不同的哈希码,所以这两个测试添加的对象被视为不同。

最佳答案

在这种情况下,它与hashCode() 无关,而是与equals() 方法有关。 HashSet 仍然是 Set,具有不允许重复的语义。使用 equals() 方法检查重复项,如果是 String 将返回 true

然而,对于您的test 类,equals() 方法没有定义,它将使用Object 的默认实现,它只会返回true当两个引用都指向同一个实例时。

方法 hashCode() 不是用来检查对象是否应该被视为相同的,而是作为一种基于散列函数将它们分布在集合中的方法。对于两个对象,此方法绝对有可能返回相同的值,而 equals() 将返回 false。

附言ObjecthashCode 实现不保证值的唯一性。使用简单的循环很容易检查。

关于java hashCode疑惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5630609/

相关文章:

java - 计算hashCode时转换数据类型

java - 一致的 Equals() 结果,但不一致的 TreeMap.containsKey() 结果

java - HashMap 没有给出预期的输出

Java - 将 Yaml 解析为 Json

JavaFX ImageView - 图像清理

Java,如何通过引用传递

java - hashCode() 和 equal() 方法中是否必须包含 Hashset 等集合类型字段

java - 如何将 char[][] 扁平化为 char[]?

java - 使用 DataSerializable 的 Hazelcast 3.5 序列化

Java hashCode() 在同一对象创建的不同执行中有所不同