我知道合同说“如果两个对象相同,那么它们应该返回相同的哈希码”。这样就可以将这些对象放置在同一个散列桶中,并改进已知的散列码相关收集功能。然后再说明为什么它说“如果两个对象具有相同的哈希码,那么它们不应该总是等于”。我的意思是,如果在合同中这是真的,我们应该说“如果两个对象是相等的,它们可能会返回相同的哈希码,但这不是强制性的”哈希码和等于合同反之亦然
回答
我的意思是,如果这是真的在合同中,我们应该说“如果两个对象是平等的,他们可能会返回相同的 哈希代码,但它不是强制性的”
不,它不应该 。这是因为,当一个对象被搜索,让我们在HashMap
或HashSet
说,那么先搜索它的hashCode
的基础上(注: - 。hashCode()
不用于在ArrayList
,或LinkedList
病例检索它们不hash based
集合),然后如果两个对象具有相同的散列码,它移动到equals
方法来比较对象本身。
现在假设,如果上述声明是真实的,第一个测试本身会失败的那些对象。也就是说,如果两个相等的对象可以有不同的哈希码,然后在搜索特定的hashCode,它不会返回正确的结果,因此,测试将不再继续equals method
,并宣布这些对象是unequal
即使你期望他们是平等的。
现在让移动到第二声明: -
如果两个对象具有相同的散列码那些不应该总是等于”
让我们这样理解: - 由于hashCode
产生每个对象是int
型的,因此您可以产生的最大2^32
独特hashcodes
。所以,想象一下,如果你想存储比这更多的对象会发生什么。在这种情况下,必须有一个collison for two different objects
。所以,除了将相同的hashCodes
分配给两个不同的对象外,没有别的办法。因此上述说法是有道理的。
所以,两件事从上面的解释很清楚: -
- 两个相同的对象必须有相同的哈希码。
- 两个不同的对象可以有相同的哈希码。在下面的链接这一主题
更多详细资料(没有什么可以给比这更好的解释): -
我写了一个示例程序来测试你提到的内容。我只覆盖A的equals方法,而不是哈希码。 但以下返回true。你能解释一下怎么出来真正retrns,因为我有 永远不会为列表添加a3,正如你所提到的那些对象有不同的哈希码和 ,因为在列表中找不到a3哈希码,它应该返回错误的权利? A a1 = new A(); a1.setName(“a”); A a2 = new A(); a2.setName(“a”); A a3 = new A(); a3.setName(“a”); List list = new ArrayList(); list.add(a1); list.add(a2); \t \t System.out.println(list.contains(a3)); – FrankD
抱歉格式不正确。我不能格式化评论 – FrankD
@HarshanaD ..对不起,没有提及'hashCodes'不用于搜索的情况下'列表'。它用于Maps - 'HashMap','LinkedHashMap','Hashtable'或'HashSet'。这就是它工作的原因。我相应地编辑了我的答案。 - 我的答案的第一部分。 –
没有。文件是正确的,而你越来越混淆。
- 两个对象相同必须具有相同的哈希码。
- 两个 具有相同散列码的对象可能不相等。
- 对于散列表性能的缘故 ,您通常希望两个对象而不是 尽可能经常具有不同的散列码。
例如,以下是总是的hashCode()
有效实现:
public int hashCode() {
return 0;
// clearly all equal objects have the same hash code -- 0
// but it's totally okay that unequal objects also have the same hash code
}
你想要什么细节? –
如果2个相同的散列码必须来自相同的对象,比哈希不会一样安全。在技术上可以确定密码基于散列。这会破坏哈希码的目的(至少在安全意义上)。
对于非安全哈希,如果您可以让每个唯一值构成一个唯一哈希值,那么您将解决未解决的计算问题。
A HashMap
可以存储多个条目每桶,并且选择哪个存储桶取决于散列码。 HashMap
通过使用hashcode()
来标识存储桶,然后equals()
找到该存储桶中的匹配关键字,从而找到关键字的条目。
鉴于上述情况,应该明确的是,你可以有一点问题重复哈希码(它影响HashMaps这样的性能如果多个对象具有相同的哈希码,但一切仍然有效)
散列函数通常
单向函数
:某些输入值(对象)可以产生相同的散列码。
它基本上是说,如果两个物体有相同的hashCode他们应该是相等的。但它并不总是会发生,因为它们不是一个完美的散列函数,它会将不同的散列分配给不同的对象。
由于散列冲突,不同的对象可以具有相同的散列码。
但有两个对象是等于应该有相同的哈希码。
- 1. 不等于之前SQL性能相等,反之亦然
- 2. TFS到GitHub和反之亦然同步
- 3. JAXB对象 - 哈希码和等于
- 4. 合并视图,反之亦然?
- 5. Java合同检查 - 内置?例如。哈希码/等于
- 6. php编码字符串,反之亦然
- 7. 反射哈希码?
- 8. NSImage cv :: Mat,反之亦然
- 9. hadoop mapreduce反之亦然
- 10. boost :: shared_ptr void *反之亦然
- 11. XAML到Html,反之亦然
- 12. 长[]要长[],反之亦然?
- 13. PHP到C#反之亦然
- 14. 如何配置ReSharper接受[Required](来自PostSharp)等同于[NotNull](反之亦然)?
- 15. 流程图到JSON和反之亦然
- 16. 演员吨至BOOL和反之亦然
- 17. IPhone在Android和反之亦然
- 18. 从ViewModel渲染Json和反之亦然
- 19. 的NSData到的NSString和反之亦然
- 20. 等同于Python dict的Ruby哈希setdefault
- 21. 重写哈希码,等于在java中
- 22. 同时向下滑动div和.fadeIn()内容,反之亦然?
- 23. 用于转换native2ascii和反之亦然的库
- 24. C++矢量和唯一号码,并且反之亦然
- 25. SDL调查事件反相W和Z和反之亦然
- 26. CakePHP - 验证哈希密码不同于安全::哈希()
- 27. Python - 客户端等待服务器输入(反之亦然)
- 28. 用多行代码替换单行代码,反之亦然
- 29. 组合与继承的平等和哈希码提供者
- 30. 哈希码和哈希集的概念
两个相同的苹果应该花费相同的,这是1金币。然而,两个花费1个金币的物品不一定是相同的苹果。 –