Java HashSet允许欺骗; 问题可比吗?

IVR*_*ger 9 java set comparable

我有一个类"Accumulator",它实现了Comparable compareTo方法,我试图将这些对象放入HashSet中.

当我向HashSet添加()时,我在调试器中的compareTo方法中看不到任何活动,无论我在哪里设置断点.另外,当我完成add()时,我在Set中看到了几个重复项.

在这里,我搞砸了什么; 为什么不比较,因此允许欺骗?

谢谢,
IVR复仇者

Mic*_*rdt 17

我搞砸了什么,这里?

HashSet基于而hashCode()不是基于compareTo().你可能会混淆它TreeSet.在这两种情况下,请务必以equals()与其他方法一致的方式实施.


SLa*_*aks 11

你需要正确实现hashCode()equals().

您必须hashCode根据类中的值覆盖并返回一个数字,以便任何两个相等的对象具有相同的哈希码.


Mic*_*ael 6

HashSet使用hashCode()equals()方法来防止添加重复项.首先,它获取要添加的对象的哈希码.然后,它找到该哈希码的相应存储桶并遍历该存储桶中的每个对象,使用该equals()方法查看集合中是否已存在任何相同的对象.

您的调试器没有破坏,compareTo()因为它从未使用过HashSet!

规则是:

  1. 如果两个对象相等,则它们的哈希码 必须相等.

  2. 但是如果两个对象的哈希码相等,那么这并不意味着对象是相等的!可能是这两个对象碰巧具有相同的哈希值.