[英]How does a hashSet admit elements
我有一個需要添加到HashSet的對象列表,例如List<Node> books
。 進一步說,就其equals
方法將各自返回false的意義而言,沒有兩本書相等。 說,然而,他們的hashCode
方法每個返回1
。 我正在使用這種極端情況,以便我可以完全理解錄取的工作原理。 所以我的問題是:HashSet會接受我所有的對象嗎?
public class Book{
...
@Override
public boolean equals(Book other){
return false;
}
@Override
public int hashCode(){
return 1;
}
}
回想一下hashSet不允許重復。
我對此感到疑惑,因為顧名思義,hashSet使用對象的哈希值。 該哈希是否與要添加的對象的hashCode有關?
是的,我知道
如果指定的元素尚不存在,則將其添加到該集合中。 更正式地說,如果此元素集中不包含任何元素e2,則將指定元素e添加到該元素集合中,從而使(e == null?e2 == null:e.equals(e2))。 如果此集合已經包含該元素,則調用將使該集合保持不變並返回false。
但是對象的hashCode與HashSet中的哈希值如何相關?
一個Set
由多個桶組成,以加快搜索速度。 將新對象添加到Set
,將使用對象的hashCode()
方法評估其哈希值。
然后,根據該哈希 , Set
決定將對象存儲在哪個存儲桶中。
然后,當您在該Set
搜索對象時(例如,使用contains()
方法),將再次對哈希進行求值,然后Set
遍歷單個存儲桶中的所有元素(而不是遍歷Set
所有元素) )。 這使速度快得多,因為-通常-設置元素在多個存儲桶之間平均分配(或多或少)。
在您的情況下,所有對象都將存儲在一個存儲桶中,因此您的Set
工作原理(就性能而言)實際上不會與List
有所不同。
並回答原始問題:是的,只要正確地實現了它們的equals()
,它將存儲所有對象。
使用以下答案: Java HashMap如何處理具有相同哈希碼的不同對象? 以及HashSet<E>
只是HashMap<E, Object>
。
你的問題讓我有些困惑。 HashSet將使用添加元素的hashCode()
方法(在本例中為List<Node> books
)。 因此,如果您添加List
本身,則HashSet將在List
而不是Book
上調用hashCode,除非您分別添加Book
元素。 如果單獨添加它們,則將其稱為您在問題中定義的hashCode()
。
附帶說明,永遠不要在hashCode()
返回常量值。 請參見hashCode方法的最佳實現
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.