use*_*918 1 java equals hashmap hashcode hashset
hashcode 或 hashmap 是如何工作的,如果我们重写总是返回常量的 hashcode 并且重写的 equals 方法返回 false,那么它如何在返回或删除时识别确切的对象?time bean 忘记了性能所有这些东西,我的问题是它如何能够识别确切的对象,让我多解释一下,我有一个包含两个字段的 person 类,并且覆盖了始终返回 1 的 hashcode 和返回 false 的覆盖 equals 方法,创建了 3 个对象,对象 1 -- id 10 名称 AAAA,对象 2 -- id 20,名称 BBB,对象 3 -- id 30,名称 CCC,我已将所有三个对象添加到 hashSet,之后删除了对象2、这里如何识别准确的对象(20,BBB)
HashMap好吧,常量哈希码是有效的,并且“仅”在使用/HashSet或其他使用它来优化比较/搜索的代码时出现性能问题。
equals()然而,总是返回 的实现打破false了 equals 契约,并且会导致许多类型的集合出现问题/令人惊讶的行为。
equals 方法在非空对象引用上实现等价关系:
- 它是自反的:对于任何非空引用值 x,x.equals(x) 应该返回 true。
- 它是对称的:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
- 它是传递性的:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true 并且 y.equals(z) 返回 true,则 x.equals(z) 应返回 true。
- 它是一致的:对于任何非空引用值 x 和 y,如果对象的 equals 比较中使用的信息没有被修改,则多次调用 x.equals(y) 一致返回 true 或一致返回 false。
- 对于任何非空引用值 x,x.equals(null) 应返回 false。
实现return false打破了第一个要求。
- 如果两个对象根据 equals(java.lang.Object) 方法不相等,则不要求对这两个对象中的每一个调用 hashCode 方法必须产生不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。
正如 @Mensur QulamiHashMap在评论中指出的那样,如果您的实现使用引用比较来==优化节点搜索,它可能仍然可以正常工作。
从OpenJDK 12 HashMap.getNode(int hash, Object key):
((k = first.key) == key || (key != null && key.equals(k))))
所以这个实现在尝试之前检查引用相等性equals(),但这并不能保证。
JavaDocs严格定义了这一点HashMap.getequals()
更正式地说,如果此映射包含从键 k 到值 v 的映射,使得
(key==null ? k==null : key.equals(k)),则此方法返回v;否则返回null。
(如果 的实现equals满足上述约定,则这是等价的,因此 OpenJDK 所做的优化是有效的)
| 归档时间: |
|
| 查看次数: |
2851 次 |
| 最近记录: |