对于小组来说,这是一个非常基本的问题,可以更好地理解 Hashset
行为,当 equals()
方法未被覆盖。
首先我创建了一个Employee
类并覆盖其 hashcode()
这样每次都会返回 int 1。 (以确保碰撞)。
接下来在 main 方法中,我创建了 4/5 员工对象并将其插入 hashset
。现在,当我迭代hashset
时,我可以在那里看到所有插入的对象。任何人都可以解释一下这种行为,特别是这里的链接是如何发生的(请记住我没有覆盖 equal 方法)?
最佳答案
当您不重写equals
时,将使用Object.equals
的默认实现,它仅检查引用相等性:使用单独的创建的两个不同的对象>new
调用总是不同的(即使它们的内容相同)。因此,难怪您会看到所有插入的对象。但即使您创建两个具有相同内容的对象,两个对象也会被插入。
分布不好的 hashCode
只会影响有效地将映射转换为链接列表的性能(除非键是 Comparable
并且您使用的是 Java-8:在这种情况下,它将转换为更类似于 TreeSet
的内容)。
关于Java 哈希集在相等时不被覆盖时的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34265186/