簡體   English   中英

hashSet如何接納元素

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM