2015-02-23 66 views

回答

9

您不能,因爲hashCode僅用於定位對象存儲在HashSet內的bin。同一個分箱中可能有多個元素,並且HashSet使用equals來確定搜索到的元素是否存在於hashCode映射到的分箱中。

bin可能包含多個元素具有相同的hashCode,所以只知道hashCode是不夠的。

+0

難道你不能迭代比較內容的相應hashCodes與已知的hashCode嗎?不一定優雅,但可行 – Tgsmith61591 2015-02-23 17:16:34

+4

@ Tgsmith61591如果多個元素具有相同的hashCode會怎樣? – Eran 2015-02-23 17:17:14

1

不,你不能。在散列集合中查找對象時,equals和hashcode都是必需的。散列碼方法告訴哪個存儲桶找到對象,equals方法在存儲桶中查找對象。

一個真實世界的例子將是一個有很多人的房子。如果你告訴我去某個房子裏找人,我會問你兩個問題:

  1. 什麼房子我去?
  2. 我能找到誰?

這裏(1)將通過哈希碼來回答,(2)將通過等於方法回答。

1

A hashCode不是一個獨特的識別屬性,所以沒有。

1

不,因爲2個對象可以具有相同的哈希碼。檢查Set(或中的密鑰)中的對象的唯一性是針對hashCode()equals()進行檢查的。

3

你可以做一個特殊的對象,像這樣

int hashCode = 1; // your 
new Object() { 
    @Override 
    public boolean equals(Object obj) { 
     return true; 
    } 
    @Override 
    public int hashCode() { 
     return hashCode; 
    } 
}; 
+0

這很聰明,但它取決於調用'cleverObject.equals(objectInSet)'的集合。如果有任何測試'objectInSet.equals(cleverObject)'的設置實現,或者java.util中的實現發生更改,則會中斷。換句話說,你違反了'平等'合同,你可能會放棄一段時間,但它可能會回來咬你。 – 2015-02-23 17:33:55

0

所有對象方法的hashCode(),由HashSet的,HashMap中,ECC叫..

您可以覆蓋此方法來定義自己的邏輯

@Override 
    public int hashCode() { 
     return <<MY CODE HERE>>; 
    } 

,或者更簡單,迭代你的HashSet和檢查的hashCode()值

int myHash = 123; 
for(Object o:mySet){ 
    if(myHash == o.hashCode()){ 
    // do something.. 
    } 
}