2012-06-06 43 views
0

我创建了一个类Person(正如本书所说)来保存从键盘输入的人的名字和姓氏,然后还有另一个类PhoneNumber,它将国家代码,地区代码和人数封装为串。
此人旨在用作Hashmap中的键。
类别BookEntry封装了PersonPhoneNumber。很多BookEntry对象组成了一个表示电话簿的HashMap。什么时候包括什么?

Person implements Comparable<Person>所以它包含CompareTo(Person)方法。后来该书增加了equals(Object anotherPerson)方法。
我的问题是,是不是CompareTo方法足以比较两个键?还是说HashMap的内部机制要求我包含equals()方法来比较两个键?
的compareTo()

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

equals()方法

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

“equals()”的参数不一定总是一个Person或它的子类。 –

+1

你的'equals()'实现不完整。您必须检查参数对象是否实际上是'Person'类型。 – adranale

+0

我知道。如果我传递'String',程序崩溃:) –

回答

1

compareTo()方法在排序中,

此方法的实现将决定谁是更大(较小,下同)两人之间,也在什么程度

equals() & hashcode()将在基于散列数据结构(HashMap中)在你的情况下使用

用户定义的类作为HashMap中的一个关键

是的,你需要实现hashcode()equals()正确

请参见

+0

所以基本上,如果我使用用户定义的类作为键,那么它必须**有一个“equals()”和一个“compareTo()方法被内部机制使用,如果我正确地得到它:) –

+0

_user定义的类作为key_ of'HashMap'是的,你需要正确地指明hashcode()和equals()' –

+0

你不一定有一个equals()方法。默认情况下,equals只是将==用于相等性,对于大量情况来说这很好。 – Polygnome

2

一些数据结构会使用compareTo(例如TreeMap)和一些将使用equals(例如HashMap)。

更重要的是,它强烈建议compareToequals是一致的,在解释Comparator javadoc

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

另一个提示,在TreeMap javadoc(重点煤矿)发现:

注意,排序由一棵树映射维护,像任何排序的映射,以及明确的比较是否被提供,如果此有序映射要正确实现Map接口必须与equals一致。

最后,如果重写equals你也应该重写hashcode以防止在使用基于散列的结构时发生意外行为。

+0

所以如果我不知道哪个数据结构使用什么,我可以使用两者的组合,就像在我的情况下一样:) –

+1

@FasihKhatib是的,如果你的类实现了'Comparable',最好的做法是用你的'compareTo'实现重写'equals'和'hashcode'。它可以帮助您在稍后再次抓到错误。但是如果这是你的问题,你的类**不需要实现'Comparable' **来用于'HashMap'。 – assylias

+0

我会记住你的建议。 :) –

1

HashMap使用equals()而不是compareTo(),所以你必须实现它。 TreeMap使用compareTo()

+0

但'equals()'工作,我需要'compareTo()'。现在有意义:) –

+2

不,你不一定需要'compareTo()'为'HashMap'。你需要'equals'和'hashCode'是一致的。就这些。 –

+0

好的,所以比较的代码将包含在equals()方法中。 –

相关问题