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
).
的东西
当 equals()
方法未被覆盖时,为了更好地理解 Hashset
行为,这是一个非常基本的问题。
首先,我创建了一个 Employee
class 并覆盖了它的 hashcode()
,这样它每次都会 return int 1。 (以确保碰撞)。
接下来在 main 方法中,我创建了 4/5 个员工对象并推入 hashset
。现在,当我遍历 hashset
时,我可以在那里看到所有插入的对象。任何人都可以解释这种行为,特别是链接是如何发生的(请记住我没有覆盖 equal 方法)?
当您不覆盖 equals
时,将使用 Object.equals
的默认实现,它仅检查引用相等性:始终使用单独的 new
调用创建两个不同的对象不同(即使它们的内容相同)。所以难怪你会看到所有插入的对象。但即使您创建两个内容相同的对象,它们也会被插入。
分布不当 hashCode
只会影响将映射有效转换为链表的性能(除非键是 Comparable
并且您使用的是 Java-8:在这种情况下它将转换为更类似于 TreeSet
).