问题标签 [hashcode]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
401 浏览

java - Java:通知提供者与 hashCode 驱动的 Map 的实现

我已经为一组通用侦听器实现了抽象通用提供程序E,后代必须notifyListener(E)用特定的通知代码覆盖。对于我选择的听众后备名单WeakHashMap<K,V>。侦听器必须作为弱引用:

典型用途:

一切正常,但是当我需要AbstractList后代类作为侦听器时,支持WeakHashMap只接受一个侦听器实例!很明显——方法hashCode()equals()监听器为所有实例(空列表)返回相同的值,所以WeakHashMap.put只替换以前添加的监听器。

什么是最好的解决方案?

  1. 使用另一个非 hashCode 支持集合——但WeakHashMap对我来说太棒了,因为自动为我管理弱引用

  2. 使用非通用监听器,例如具有简单equals() { return (this == object); }实现的抽象类——但这不是那么灵活

  3. addListener(E)使用简单的 equals() 为侦听器使用一些包装器——但由于弱引用,此包装器对调用者不能透明

另一个想法?

0 投票
12 回答
53846 浏览

java - 接口中的 toString()、equals() 和 hashCode()

所以,我有一个带有一堆需要实现的方法的接口,方法名称是无关紧要的。

实现此接口的对象通常被放入集合中,并且还具有我希望它们使用的特殊 toString() 格式。

因此,我认为将 hashCode()、equals() 和 toString() 放入接口会很方便,以确保我记得覆盖这些的默认方法。但是当我将这些方法添加到接口时,如果我没有实现这三个方法,IDE/编译器不会抱怨,即使我明确地将它们放在接口中。

为什么这不会对我强制执行?如果我不实现任何其他方法,它会抱怨,但它不会强制执行这三个方法。是什么赋予了?有什么线索吗?

0 投票
9 回答
47902 浏览

java - java.util.HashMap 和 HashSet 的内部实现

我一直在尝试了解java.util.HashMapand的内部实现java.util.HashSet

以下是我脑海中浮现的疑问:

  1. @Override public int hashcode()HashMap/HashSet 中的重要性是什么?这个哈希码在内部使用在哪里?
  2. 我通常看到 HashMap 的键是Stringlike myMap<String,Object>。我可以将值映射到someObject(而不是字符串)myMap<someObject, Object>吗?我需要遵守哪些合同才能成功实现?

提前致谢 !

编辑:

  1. 我们是说键的哈希码(检查!)是哈希表中映射值的实际事物吗?而当我们在myMap.get(someKey);内部调用 javasomeKey.hashCode()来获取哈希表中的数字以查找结果值时呢?

回答:是的。

编辑2:

  1. 在 ajava.util.HashSet中,从哪里生成 Hash 表的键?是否来自我们正在添加的对象,例如。mySet.add(myObject);那么myObject.hashCode()将决定将其放置在哈希表中的哪个位置?(因为我们不在 HashSet 中给出键)。

答:添加的对象成为键。价值是虚的!

0 投票
7 回答
2722 浏览

java - java中所有基于哈希的数据结构都使用“桶”概念吗?

我知道的哈希结构 - HashTable、HashSet 和 HashMap。

它们是否都使用桶结构 - 即当两个哈希码完全相同时 一个元素不会覆盖另一个元素,而是将它们放置在与该哈希码关联的同一个桶中?

0 投票
6 回答
20636 浏览

java - 什么是哈希码计算的合理素数?

Eclipse 3.5 有一个非常好的特性来生成Java hashCode() 函数。它会生成例如(稍微缩短:)

(如果类中有更多属性,result = prime * result + attribute.hashCode();则为每个附加属性重复。对于 ints .hashCode() 可以省略。)

这似乎很好,但对于素数的选择 31。它可能取自Java String 的 hashCode 实现,它是出于性能原因而使用的,在引入硬件乘法器之后早已不复存在。在这里,对于 i 和 j 的小值,您有许多哈希码冲突:例如 (0,0) 和 (-1,31) 具有相同的值。我认为这是一件坏事(TM),因为小值经常出现。对于 String.hashCode,您还会发现许多具有相同哈希码的短字符串,例如“Ca”和“DB”。如果你取一个大素数,如果你选择素数,这个问题就会消失。

所以我的问题是:什么是好的素数?你用什么标准来找到它?

这是一个一般性问题——所以我不想给出 i 和 j 的范围。但我想在大多数应用程序中,相对较小的值比较大的值更频繁地出现。(如果你有很大的值,那么选择素数可能并不重要。)它可能没有太大的区别,但更好的选择是改进这一点的简单而明显的方法 - 那么为什么不这样做呢?Commons lang HashCodeBuilder还提出了奇怪的小值。

澄清:这不是Why does Java's hashCode() in String use 31 as a multiplier?的重复?因为我的问题不关心JDK中31的历史,而是关于新代码中什么是更好的价值使用相同的基本模板。那里没有一个答案试图回答这个问题。)

0 投票
7 回答
2285 浏览

java - Java:获取对象的唯一属性(如哈希码,但防冲突)

我有一项任务,需要为集合中的每个对象生成唯一值。如果哈希码合约中不允许冲突,那么使用哈希码将是完美的。

一个想法:将每个对象的哈希码记录到一个多重集中。然后,使用哈希码作为唯一标识符,但如果该哈希码不止一次在集合中,则使用也不在集合中的不同值。但这感觉笨重和尴尬。

更好的想法?

这是我已经拥有的:

编辑:我想这最初并不清楚,但是 id 编号确实需要成为对象的函数,因为getVertexName(V)会被多次调用,并且它期望对于相同的值V,它会得到相同的结果。

此外,Vertex 类型是通用的。所以我不能对特定的类进行任何修改来解决这个问题。

0 投票
1 回答
707 浏览

java - 我应该如何实现这个 HashMap 的 equals 和 hashCode 方法来表示自动机状态?

我想将 State 对象(它们是以 Character 作为键,State 作为 Value 的 HashMaps 放入名为 allStates 的 ArrayList 中。我应该在这里覆盖 equals 和 hashCode 方法吗?为什么?如何?

此代码适用于我迄今为止构建的 Automaton 和 State 类:

0 投票
3 回答
2731 浏览

java - 当在 JVM5 和 JVM6 中运行相同的程序时,HashMap 中的项目顺序不同

我有一个应用程序,它按行显示一组对象,一个对象 = 一行。对象存储在 HashMap 中。行的顺序不会影响应用程序的功能(这就是使用 HashMap 而不是可排序集合的原因)。

但是我注意到,当使用两个不同版本的 Java 虚拟机运行相同的应用程序时,运行方式会有所不同。该应用程序使用 JDK 5 编译,可以使用 Java 5 或 Java 6 运行时运行,没有任何功能差异。

有问题的对象会覆盖java.lang.Object#hashCode(),并且显然已经注意遵循 Java API 中指定的约定。事实证明,它们在应用程序的每次运行中总是以相同的顺序出现(在同一个 Java 运行时中)。

出于好奇,为什么 Java 运行时的选择会影响顺序?

0 投票
9 回答
105614 浏览

java - 了解 HashMap 中 equals 和 hashCode 的工作原理

我有这个测试代码:

// public int hashCode() { return 9; }未注释 时m.size()返回 2,未注释时返回 3。为什么?

0 投票
2 回答
1932 浏览

hibernate - 在实体类上是否等于和哈希码,这是个问题

我一直在尝试推理处理在实体上实现哈希码和 equals 是否通常是一种好的做法的最佳方法(我的意思是一般意义上的实体,但在大多数情况下它将是 JPA 实体)。

在 Hibernate 手册http://docs.jboss.org/hibernate/core/3.3/reference/en/html/best-practices.html的第 24 章中,它说...

识别所有实体的自然键,并使用 . 实现 equals() 和 hashCode() 来比较构成自然键的属性。

让 .equals 和 .hashcode 只包含这些自然键是有意义的,但是如果您有多个相同实体的实例(相同的自然 id 因此相同的哈希码)怎么办?似乎这种做法可能会对您的应用程序的其他地方产生微妙的影响。以前有人大规模尝试过吗?