繁体   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