我创建了一个类Person
(正如书中所说)来保存从键盘输入的人的姓名和名字,然后还有另一个类PhoneNumber
,它封装了国家代码,区域代码和作为字符串的人的数量
Person旨在用作Hashmap中的键
类BookEntry
封装了Person
和PhoneNumber
。很多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;
}
答案 0 :(得分:2)
某些数据结构将使用compareTo
(例如TreeMap
),有些将使用equals
(例如HashMap
)。
更重要的是,强烈建议compareTo
和equals
保持一致,如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()
。