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