草庐IT

hashCodes

全部标签

java - 为什么我需要覆盖 Java 中的 equals 和 hashCode 方法?

最近我通读了这个DeveloperWorksDocument.该文档是关于有效且正确地定义hashCode()和equals()的内容,但是我无法弄清楚为什么我们需要覆盖这两个方法.我如何才能做出有效实现这些方法的决定? 最佳答案 JoshuaBloch谈有效的JavaYoumustoverridehashCode()ineveryclassthatoverridesequals().FailuretodosowillresultinaviolationofthegeneralcontractforObject.hashCode()

java - 为什么 Java 的 String 中的 hashCode() 使用 31 作为乘数?

根据Java文档,hashcode对于String对象计算为:s[0]*31^(n-1)+s[1]*31^(n-2)+...+s[n-1]usingintarithmetic,wheres[i]istheithcharacterofthestring,nisthelengthofthestring,and^indicatesexponentiation.为什么要用31作为乘数?我知道乘数应该是一个比较大的素数。那么为什么不是29、37甚至97? 最佳答案 根据JoshuaBloch的EffectiveJava(一本再怎么推荐都不够的

java - 一个单元应该如何测试 hashCode-equals 合约?

简而言之,hashCode合约,根据Java的object.hashCode():除非影响equals()的内容发生更改,否则哈希码不应更改equals()表示哈希码是==让我们假设主要对不可变数据对象感兴趣-它们的信息在构造后永远不会改变,因此假设#1成立。剩下#2:问题只是确认equals意味着哈希码==。显然,我们无法测试所有可能的数据对象,除非该集合非常小。那么,编写可能捕获常见情况的单元测试的最佳方法是什么?由于此类的实例是不可变的,因此构造此类对象的方法有限;如果可能,此单元测试应涵盖所有这些。在我的脑海中,入口点是子类的构造函数、反序列化和构造函数(应该可以归结为构造函数

java - 一个单元应该如何测试 hashCode-equals 合约?

简而言之,hashCode合约,根据Java的object.hashCode():除非影响equals()的内容发生更改,否则哈希码不应更改equals()表示哈希码是==让我们假设主要对不可变数据对象感兴趣-它们的信息在构造后永远不会改变,因此假设#1成立。剩下#2:问题只是确认equals意味着哈希码==。显然,我们无法测试所有可能的数据对象,除非该集合非常小。那么,编写可能捕获常见情况的单元测试的最佳方法是什么?由于此类的实例是不可变的,因此构造此类对象的方法有限;如果可能,此单元测试应涵盖所有这些。在我的脑海中,入口点是子类的构造函数、反序列化和构造函数(应该可以归结为构造函数

java - 为什么 String 的 hashCode() 不缓存 0?

我注意到在String的Java6源代码中,hashCode只缓存0以外的值。以下代码段展示了性能上的差异:publicclassMain{staticvoidtest(Strings){longstart=System.currentTimeMillis();for(inti=0;iRunningthisinideone.com给出以下输出:Took1470ms.Took58ms.所以我的问题是:为什么String的hashCode()不缓存0?Java字符串哈希为0的概率是多少?对于散列为0的字符串,避免每次重新计算散列值的性能损失的最佳方法是什么?这是缓存值的最佳做法吗?(即缓存

java - 为什么 String 的 hashCode() 不缓存 0?

我注意到在String的Java6源代码中,hashCode只缓存0以外的值。以下代码段展示了性能上的差异:publicclassMain{staticvoidtest(Strings){longstart=System.currentTimeMillis();for(inti=0;iRunningthisinideone.com给出以下输出:Took1470ms.Took58ms.所以我的问题是:为什么String的hashCode()不缓存0?Java字符串哈希为0的概率是多少?对于散列为0的字符串,避免每次重新计算散列值的性能损失的最佳方法是什么?这是缓存值的最佳做法吗?(即缓存

java - Java中hashCode和equals方法的关系

这个问题在这里已经有了答案:WhatissuesshouldbeconsideredwhenoverridingequalsandhashCodeinJava?(11个回答)WhydoIneedtooverridetheequalsandhashCodemethodsinJava?(31个回答)关闭9年前。我在很多地方读到过,在Java中重写equals方法时,也应该重写hashCode方法,否则就是“违反契约(Contract)”。但是到目前为止,如果我只覆盖equals方法而不是hashCode方法,我还没有遇到任何问题。什么是契约(Contract)?为什么我在违反契约(Cont

java - Java中hashCode和equals方法的关系

这个问题在这里已经有了答案:WhatissuesshouldbeconsideredwhenoverridingequalsandhashCodeinJava?(11个回答)WhydoIneedtooverridetheequalsandhashCodemethodsinJava?(31个回答)关闭9年前。我在很多地方读到过,在Java中重写equals方法时,也应该重写hashCode方法,否则就是“违反契约(Contract)”。但是到目前为止,如果我只覆盖equals方法而不是hashCode方法,我还没有遇到任何问题。什么是契约(Contract)?为什么我在违反契约(Cont

java - Java中的hashCode有什么用?

在Java中,obj.hashCode()返回一些值。这个哈希码在编程中有什么用? 最佳答案 hashCode()用于Hash实现中的bucketing,如HashMap、HashTable、HashSet等从hashCode()收到的值用作bucket编号,用于存储set/map的元素。这个桶号是集合/映射中元素的地址。当您执行contains()时,它将获取元素的哈希码,然后查找哈希码指向的存储桶。如果在同一个bucket中发现超过1个元素(多个对象可以有相同的hash码),则使用equals()方法判断对象是否相等,然后判断是

java - Java中的hashCode有什么用?

在Java中,obj.hashCode()返回一些值。这个哈希码在编程中有什么用? 最佳答案 hashCode()用于Hash实现中的bucketing,如HashMap、HashTable、HashSet等从hashCode()收到的值用作bucket编号,用于存储set/map的元素。这个桶号是集合/映射中元素的地址。当您执行contains()时,它将获取元素的哈希码,然后查找哈希码指向的存储桶。如果在同一个bucket中发现超过1个元素(多个对象可以有相同的hash码),则使用equals()方法判断对象是否相等,然后判断是