0

我创建了一个类Person(如书中所说)来保存从键盘输入的人的姓名和姓氏,然后还有另一个类PhoneNumber将国家代码、区号和一个人的号码封装为字符串。
Person 旨在用作 Hashmap 中的键。
BookEntry封装了PersonPhoneNumber。许多BookEntry对象组成了一个代表电话簿的 HashMap。

Person实现Comparable<Person>所以它包含CompareTo(Person)方法。后来书中增加了equals(Object anotherPerson)方法。
我的问题是,CompareTo比较两个键的方法还不够吗?还是 HashMap<> 的内部机制要求我包含equals()比较两个键的方法?
相比于()

public int compareTo(Person person) {
    int result = lastName.compareTo(person.lastName);
    return result==0? firstName.compareTo(person.firstName):result;
}

等于()

public boolean equals(Object anotherPerson){
    return compareTo((Person)person)==0;
}
4

3 回答 3

2

有些数据结构将使用compareTo(例如 a TreeMap),有些将使用equals(例如 a HashMap)。

compareTo更重要的是,强烈建议equals保持一致,如Comparatorjavadoc中所述:

强烈建议但不严格要求 (x.compareTo(y)==0) == (x.equals(y))。一般来说,任何实现了 Comparable 接口并违反此条件的类都应该清楚地表明这一事实。推荐的语言是“注意:这个类有一个与equals不一致的自然顺序。”

TreeMap在javadoc中找到的另一个提示(重点是我的):

请注意,树形映射维护的排序,就像任何排序映射一样,以及是否提供显式比较器,如果该排序映射要正确实现 Map 接口,则必须与 equals 保持一致

最后,如果您覆盖,equals您还应该覆盖hashcode以防止在使用基于散列的结构时出现意外行为。

于 2012-06-06T11:10:10.857 回答
1

compareTo()方法用于排序,

此方法的实现将确定两个人之间谁更大(更小,相同),以及在什么程度上

equals()&hashcode()在您的情况下将用于基于哈希的数据结构(HashMap)

用户自定义类作为HashMap的key

hashcode()是的,您需要equals()正确实施

另见

于 2012-06-06T11:06:21.540 回答
1

HashMapuses equals()and not compareTo(),所以你必须实现它。 TreeMap使用compareTo().

于 2012-06-06T11:17:34.297 回答