我有一个需要添加到HashSet的对象列表,例如List
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()中返回常量值。请参阅hashCode方法的最佳实现
使用以下答案:Java哈希映射如何使用相同的哈希代码处理不同的对象?以及信息,即HashSet
Set
由桶组成以加快搜索速度。当新对象添加到Set
时,使用对象的hashCode()
方法评估其哈希值。
然后,基于该哈希,Set
决定将对象存储在哪个存储桶中。
然后,当您在该Set
中搜索对象时(例如使用包含()
方法),再次评估散列,然后Set
迭代单个存储桶中的所有元素(而不是迭代Set
的所有元素)。这使得它更快,因为-通常-set元素在许多存储桶中平均分布(或多或少)。
在您的情况下,所有对象都将存储在一个bucket中,因此您的集合实际上不会与列表的工作方式(即性能)不同。
回答最初的问题:是的,只要它们的等于()
实现正确,它就会存储所有对象。
Swift 4集合是用于存储相同类型的不同值,但它们没有像数组那样的有明确排序顺序。 如果不需要元素排序,或者需要没有重复值(唯一值),则可以使用集合而不是数组(集合只允许不同的值)。 类型必须是可散列类型并且是可以比较的,才能存储在一个集合中。哈希值是对象的值相等。例如,如果两个对象相等:,则。 默认情况下,所有基本值都是可散列类型,可以用作集合值。 创建集 使用以下初始化语法创建某个类型的空集
在许多Redis教程中(比如本教程),数据存储在一个集合中,但多个值组合在一个字符串中(即,用户帐户可以作为两个条目“user:1000:username”和“user:1000:password”存储在集合中)。 然而,Redis也有哈希。似乎拥有一个“user:1000”散列会更有意义,它包含一个“username”条目和一个“password”条目。您只需直接在哈希中访问它们,而不是连接字符
问题内容: 在如何哈希列表?有人告诉我,我应该转换为一个元组第一,如到。 因此,第一个不能散列,而第二个可以散列。为什么*? *我并不是真正地在寻求详细的技术说明,而是在寻找一种直觉 问题答案: 主要是因为元组是不可变的。承担以下工作: 现在,当您这样做时会发生什么?您已修改字典中的键!远道而来!如果您熟悉哈希算法的工作原理,这会让您感到恐惧。另一方面,元组是绝对不变的。看起来好像是在修改元组,但
问题内容: 我有一个哈希表。values()方法以与插入顺序不同的顺序返回值。如何获得与插入顺序相同的值?使用LinkedHashmap是一种替代方法,但不同步。 问题答案: 使用。 接口的哈希表和链表的实现,具有可预测的迭代顺序。此实现的不同之处在于,它维护一个遍历其所有条目的双向链接列表。此链表定义了迭代顺序,通常是将键插入映射中 的顺序 ( insert-order )。请注意,如果将密钥
我正在使用hibernate作为对象类型从数据库获取数据。现在我的类不(也不是它的父类)重写equals方法。因此,如果我将所有object类型插入到一个hashset中,它不应该删除重复项,但它正在删除重复项。我的问题是它如何能够识别重复项?
我在Java 7号工作。 我想知道方法在HashSet对象上是否是线程安全的。 散列集由一个线程初始化。然后我们用不可修改的集合()包装HashSet。初始化后,多个线程只调用方法。 当我阅读Javadoc时,它对我来说是不清楚的。 在HashSet Javadoc上,我们可以阅读 这个类实现Set接口,由一个哈希表(实际上是一个HashMap实例)支持。 ... 请注意,此实现不是同步的。 在H