0

我有一个类Human,其中包含两个字段age(int)name(String)。使用 Eclipse,我用这两个字段覆盖了hashCode()equals()方法。我还根据年龄字段创建了一个比较器。

现在,我创建了一个带有年龄比较器的TreeSet对象,以及Human类的两个实例(具有不同的字段值) 。然后我将这两个对象添加到集合中,但是,集合中始终只有一个对象。

为了理解问题,我打印出这两个对象的哈希值,发现它们是不同的。然后,我测试了他们的equals()方法,当我比较具有不同字段值的两个实例时,它确实输出false 。所以现在,我无法弄清楚为什么TreeSet不能处理(区分)问题。谁能给我一些帮助?非常感谢 !

4

2 回答 2

4

TreeSet 根本不使用hashCode()and equals()。它使用您作为参数传递的比较器(或compareTo()对象的方法,如果它们是 Comparable 并且您不提供比较器)。compare()如果(或compareTo())在比较这两个对象时返回 0,则 TreeSet 认为两个对象相等。

因此,如果您的比较器仅比较人类的年龄,则所有具有相同年龄的人类都将被视为相等。如果您希望人类在年龄和姓名相同时被认为是平等的,那么比较器应该按年龄进行比较,如果年龄比较返回 0,则按姓名进行比较。

于 2012-07-12T14:08:06.957 回答
2

从文档

之所以如此,是因为 Set 接口是根据 equals 操作定义的,但是 TreeSet 实例使用其 compareTo(或 compare)方法执行所有元素比较,因此从定,相等。一个集合的行为是明确定义的,即使它的顺序与equals不一致;它只是不遵守 Set 接口的一般约定。

于 2012-07-12T14:08:24.247 回答