如果我只有對象的散列碼而不是對象本身,我可以檢查對象是否在HashSet
中?檢查HashSet中是否存在元素的散列
回答
您不能,因爲hashCode
僅用於定位對象存儲在HashSet
內的bin。同一個分箱中可能有多個元素,並且HashSet
使用equals
來確定搜索到的元素是否存在於hashCode
映射到的分箱中。
bin可能包含多個元素具有相同的hashCode
,所以只知道hashCode
是不夠的。
不,你不能。在散列集合中查找對象時,equals和hashcode都是必需的。散列碼方法告訴哪個存儲桶找到對象,equals方法在存儲桶中查找對象。
一個真實世界的例子將是一個有很多人的房子。如果你告訴我去某個房子裏找人,我會問你兩個問題:
- 什麼房子我去?
- 我能找到誰?
這裏(1)將通過哈希碼來回答,(2)將通過等於方法回答。
A hashCode
不是一個獨特的識別屬性,所以沒有。
不,因爲2個對象可以具有相同的哈希碼。檢查Set
(或中的密鑰)中的對象的唯一性是針對hashCode()
和equals()
進行檢查的。
你可以做一個特殊的對象,像這樣
int hashCode = 1; // your
new Object() {
@Override
public boolean equals(Object obj) {
return true;
}
@Override
public int hashCode() {
return hashCode;
}
};
這很聰明,但它取決於調用'cleverObject.equals(objectInSet)'的集合。如果有任何測試'objectInSet.equals(cleverObject)'的設置實現,或者java.util中的實現發生更改,則會中斷。換句話說,你違反了'平等'合同,你可能會放棄一段時間,但它可能會回來咬你。 – 2015-02-23 17:33:55
所有對象方法的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..
}
}
- 1. 檢查Selenium中是否存在元素
- 2. 檢查DOM中是否存在元素
- 3. 檢查列表中的元素是否存在於python列表的元素中
- 4. 檢查元素是否在序列中
- 5. 檢查ArrayList元素是否存在
- 6. 檢查數組元素是否存在
- 7. 檢查一個元素是否存在
- 8. 檢查DIV內是否存在元素
- 9. 如何檢查元素是否存在?
- 10. JAXB - 檢查是否存在子元素
- 11. jQuery檢查元素是否存在onClick
- 12. 檢查元素是否存在
- 13. as3 xml檢查元素是否存在
- 14. 檢查XPath是否存在元素
- 15. 檢查ListViewItemCollection元素是否存在
- 16. 檢查表單元素是否存在
- 17. 散列中是否存在隱藏的空白元素?
- 18. 檢查父元素中是否存在元素
- 19. 如何檢查TCL中是否存在列表元素?
- 20. Python如何檢查列表中是否存在元素?
- 21. 如何檢查Ada中是否存在陣列元素
- 22. GNU-make檢查元素是否存在於列表/數組中
- 23. 如何檢查列表中是否存在元素python
- 24. 如何檢查散列中的密鑰是否存在(redis)?
- 25. 檢查密鑰是否存在於散列表中JSP Struts 2
- 26. 檢查子列表上是否存在元素
- 27. 如何檢查向量元素存在於HashSet的或不是在java嗎?
- 28. 檢查元素是否在樹中
- 29. 檢查是否在數組中存在的元素
- 30. 檢查Hashset中是否存在對象的單一屬性值列表
難道你不能迭代比較內容的相應hashCodes與已知的hashCode嗎?不一定優雅,但可行 – Tgsmith61591 2015-02-23 17:16:34
@ Tgsmith61591如果多個元素具有相同的hashCode會怎樣? – Eran 2015-02-23 17:17:14