我有一个 Human 类,其中包含两个字段 age(int) 和 名称(字符串) 即可。使用eclipse,我用这两个字段覆盖 hashCode() 和 equals() 方法。我还根据 年龄 字段创建比较器。
现在,我创建了一个 TreeSet 对象,其中包含 Comparator 的年龄,还有两个 Human 类的实例(具有不同的字段值) 。然后我将这两个对象添加到集合中,但是,集合中始终只有一个对象。
为了解这个问题,我打印出这两个对象的哈希值,发现它们是不同的。然后,我测试他们的 equals() 方法,当我比较具有不同字段值的两个实例时,它会输出 false 。所以现在,我无法弄清楚为什么 TreeSet 无法处理(区分)问题。谁能给我一些帮助?非常感谢!
答案 0 :(得分:4)
TreeSet根本不使用hashCode()
和equals()
。它使用您传递的比较器作为参数(或对象的compareTo()
方法,如果它们是可比较的并且您不提供比较器)。如果compare()
(或compareTo()
)在比较这两个对象时返回0,则TreeSet认为两个对象相等。
因此,如果您的比较器仅比较人类的年龄,则所有具有相同年龄的人将被视为相等。如果你想让人类在年龄和名字相同时被认为是平等的,那么比较者应该按年龄进行比较,然后如果年龄比较为0则按名称进行比较。
答案 1 :(得分:2)
这是因为Set接口是根据equals定义的 操作,但TreeSet实例执行所有元素比较 使用compareTo(或compare)方法,因此有两个元素 从该方法的角度来看,这种方法被认为是平等的 等于。即使订单是有序的,集合的行为也是明确定义的 与平等不一致;它只是没有遵守一般合同 Set接口。