我在Java中產生了一堆對象。每個對象都有屬性區和一組整數。我想要將這些對象存儲在地圖中(鍵值應該是越來越多的整數)。如果兩個對象的面積相等並且它們的集合相同,則兩個對象相同。在Java中找到相同的對象
如果兩個對象沒有相同的區域,那麼我不需要檢查它們的集合是否相同。
在Java中實現這一點的最佳實踐是什麼?我應該如何編寫散列和相等的函數?
我在Java中產生了一堆對象。每個對象都有屬性區和一組整數。我想要將這些對象存儲在地圖中(鍵值應該是越來越多的整數)。如果兩個對象的面積相等並且它們的集合相同,則兩個對象相同。在Java中找到相同的對象
如果兩個對象沒有相同的區域,那麼我不需要檢查它們的集合是否相同。
在Java中實現這一點的最佳實踐是什麼?我應該如何編寫散列和相等的函數?
下面是由IDE生成的樣本對hashCode\equals
:
class Sample {
final int area;
final Set<Integer> someData;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Sample sample = (Sample) o;
if (area != sample.area) return false;
if (!someData.equals(sample.someData)) return false;
return true;
}
@Override
public int hashCode() {
int result = area;
result = 31 * result + someData.hashCode();
return result;
}
}
此代碼假定someData
不能爲空 - 以簡化事情。您可以看到首先檢查類型的相等性,然後檢查area
相等性,然後檢查相等性Set<Integer>
。請注意,在此使用內置equals
的Set
- 因此您已重新使用該方法。這是測試複合類型是否平等的慣用方法。
只需要在equals
(在==
之後進行類型檢查當然)首先比較它們的區域,如果它們不同,則返回false
。如果面積相等,繼續比較。
對於實施equals
(和hashCode
)一般來說,這裏是a relevant thread和a good article(包括幾個進一步的參考文獻)。
一條經驗法則是,你應該比較您的equals()
執行所有相關領域(最快第一,所以在前面比較你area
s,則整臺),並在您的hashCode()
使用相同的字段。如果有疑問,使用Eclipse的Source - Generate hashCode() and equals()...
特徵(。,然後修復equals()
代碼到第一比較area
多個)
只有在您要對對象進行排序時才需要。如果你只需要有這樣的對象的字典,你只需要適當的'hashCode()'和'equals()' – 2012-04-03 12:56:44