什么时候包含什么?

时间:2012-06-06 11:01:36

标签: java hashmap comparable compareto

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

Person实现了Comparable<Person>,因此它包含CompareTo(Person)方法。后来这本书增加了equals(Object anotherPerson)方法 我的问题是,CompareTo方法不足以比较两个密钥吗?或者是HashMap的内部机制&lt;&gt;要求我包含equals()方法来比较两个键吗? compareTo()

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;
}

3 个答案:

答案 0 :(得分:2)

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

更重要的是,强烈建议compareToequals保持一致,如Comparator javadoc中所述:

  

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

TreeMap javadoc中的另一个提示(强调我的):

  

请注意,树映射维护的顺序,如任何有序映射,以及是否提供显式比较器,必须与equals一致,如果此有序映射要正确实现Map接口

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

答案 1 :(得分:1)

compareTo()方法用于排序,

这种方法的实施将决定谁在两个人之间更大(更小,相同),也在哪个程度上

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

  

用户定义的类作为HashMap的键

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

另见

答案 2 :(得分:1)

HashMap使用equals()而非compareTo(),因此您必须实施它。 TreeMap使用compareTo()