Java 不覆盖等于时的哈希集行为?

Java Hashset behavior when equal NOT overridden?

equals() 方法未被覆盖时,为了更好地理解 Hashset 行为,这是一个非常基本的问题。

首先,我创建了一个 Employee class 并覆盖了它的 hashcode(),这样它每次都会 return int 1。 (以确保碰撞)。 接下来在 main 方法中,我创建了 4/5 个员工对象并推入 hashset。现在,当我遍历 hashset 时,我可以在那里看到所有插入的对象。任何人都可以解释这种行为,特别是链接是如何发生的(请记住我没有覆盖 equal 方法)?

当您不覆盖 equals 时,将使用 Object.equals 的默认实现,它仅检查引用相等性:始终使用单独的 new 调用创建两个不同的对象不同(即使它们的内容相同)。所以难怪你会看到所有插入的对象。但即使您创建两个内容相同的对象,它们也会被插入。

分布不当 hashCode 只会影响将映射有效转换为链表的性能(除非键是 Comparable 并且您使用的是 Java-8:在这种情况下它将转换为更类似于 TreeSet).

的东西