java - 在HashSet中插入对象的条件?

标签 java collections hash hashset

请耐心等待,因为我正在尝试引入一个与许多 Activity 线程直接矛盾的新概念。

向HashSet中插入对象的条件是什么?

查看源代码,它的目标是:

if (e.hash == hash && ((k = e.key) == key || key.equals(k)))

完整代码:HashSet.java

所以,这取决于

  1. 哈希码
  2. 等于()
  3. == 即如果它们是相同的对象。

现在,我们知道如果 obj1.equals(obj2) 返回 true,则两个对象的哈希码必须相同。根据这 3 个参数的相对值,我创建了下表: HashCode adding condition

查看条件号。 4. 尽管 equals() 返回 false,该对象仍被添加到 HashSet 中。在所有其他情况下,当且仅当 equals() 返回 false 时,对象才会被添加。因此,我们可以说(忽略条件 4),一个对象是否被添加到 HashSet 中的决定只是由 equals() 方法决定的。当被问到为什么我们使用 hashCode() 时,标准答案是它通过简单地比较整数来提高性能,因为短路运算符节省了 equals() 方法的执行。这个论点在许多线程中都有讨论,例如 Why do we check hash if we are going to check equals anyways?

但是,我发现这个论点是不正确的。如果 equals() 返回 false 并且 == 返回 true,哈希码实际上会做出决定。这是极不可能的,因为同一个对象通常会为 equals() 返回 true,直到有人显式地(违反 equals() 契约)重写 equals 方法,使其为同一对象返回不同的值。尽管如此,它还是有可能的,并且 java 似乎在某些违约代码的情况下提供了风险管理。你的看法!

最佳答案

HashSet 要求传递给它的对象遵守 hashCodeequals 的约定 - 如果不这样做,则将被视为垃圾 -垃圾输出。 equals 的约定规定,如果两个引用 ==,则它们必须相等。因此,上面的条件 4 违反了平等契约,从而违反了 HashSet 的契约,因此,当出现这样的情况时,HashSet 没有义务采取有意义的行动一组条件。

条件 5 也违反了契约(Contract)。

关于java - 在HashSet中插入对象的条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19817641/

相关文章:

JAVA SAX解析成hash map并打印出来

java - HashMap 内部使用 Node<K, V> 数组,而 Hashtable 内部使用 Map.Entry<K, V> 数组,为什么会出现这种内部差异?

c# - PowerCollections - MultiDictionary 'Remove' 在找不到值时删除所有值

javascript - node.js 请求身份验证哈希

php - 基于已知值的无冲突、简短且唯一的仅整数哈希

java - retrofit 2 : Parsing data structure in list of list without Java 8

java - 如何在匿名类中访问变量?

java - 如何优雅地交换 Map 中的键和值

java - 当对象 Hashcode 更改时,Hashmap 或 Hashset 中的查找会发生什么

java - 阻止客户端关闭与 netty 服务器的连接(我需要设置什么)吗?