博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
学习:重写hashCode()方法的必要性
阅读量:5757 次
发布时间:2019-06-18

本文共 2504 字,大约阅读时间需要 8 分钟。

当一个类有可能会和其他类发生比较的时候,我们会重写equals方法,但大多数情况下,都忽略了重写hashCode方法。

这里说一下重写hashCode的必要性。

当我们使用HashSet或者HashMap的时候,在比对value|key是否存在时,会调用hashCode方法。

注意,hashSet的contains方法其实是依赖于HashMap的containsKey方法的。

我们来看下containsKey方法的实现:

public boolean containsKey(java.lang.Object paramObject)  {    return (getEntry(paramObject) != null);  }  final Entry
getEntry(java.lang.Object paramObject) { int i = (paramObject == null) ? 0 : hash(paramObject.hashCode()); Entry localEntry = this.table[indexFor(i, this.table.length)]; for (; localEntry != null; localEntry = localEntry.next) { if (localEntry.hash == i) { java.lang.Object localObject; if (((localObject = localEntry.key) == paramObject) || ((paramObject != null) && (paramObject.equals(localObject)))) { return localEntry; } } } return null; }

 

由上面代码即可知,hashCode是重要的判断依据,没有重写hashCode,equals表现相等的两个类,它们的hashCode并不相等。

所以会导致containsKey方法返回false,测试代码如下:

包含HashCode的类:

package hashset.and.hashcode;public class ClassWithHashCode {    public int i;    public boolean equals(Object o) {        if (o == this)            return true;        if (o instanceof ClassWithHashCode) {            ClassWithHashCode code = (ClassWithHashCode) o;            return code.i == i;        }        return false;    }    public int hashCode() {        return i * 17 + 37;    }}

没有重写hasCode的类:

package hashset.and.hashcode;public class ClassWithoutHashCode {    public int i;    public boolean equals(Object o) {        if (o == this)            return true;        if (o instanceof ClassWithoutHashCode) {            ClassWithoutHashCode code = (ClassWithoutHashCode) o;            return code.i == i;        }        return false;    }}

 

测试类:

package hashset.and.hashcode;import java.util.HashSet;public class Test {    /**     * @param args     */    public static void main(String[] args) {        ClassWithHashCode c1 = new ClassWithHashCode();        ClassWithHashCode c2 = new ClassWithHashCode();        c1.i = 0;        c2.i = 0;        HashSet
set = new HashSet
(); set.add(c1); System.out.println(set.contains(c2)); ClassWithoutHashCode co1 = new ClassWithoutHashCode(); ClassWithoutHashCode co2 = new ClassWithoutHashCode(); co1.i = 0; co2.i = 0; HashSet
set1 = new HashSet
(); set1.add(co1); System.out.println(set.contains(co2)); }}

 

 

执行的结果为:

true

false

 

符合预期。证毕。

转载地址:http://rcvkx.baihongyu.com/

你可能感兴趣的文章
公司新年第一次全员大会小记
查看>>
最懒的程序员
查看>>
JAVA8 Stream 浅析
查看>>
inner join on, left join on, right join on要详细点的介绍
查看>>
SAS vs SSD对比测试MySQL tpch性能
查看>>
Spring boot 整合CXF webservice 全部被拦截的问题
查看>>
Pinpoint跨节点统计失败
查看>>
【Canal源码分析】Canal Server的启动和停止过程
查看>>
机房带宽暴涨问题分析及解决方法
查看>>
iOS 绕过相册权限漏洞
查看>>
我的友情链接
查看>>
XP 安装ORACLE
查看>>
八、 vSphere 6.7 U1(八):分布式交换机配置(vMotion迁移网段)
查看>>
[转载] 中华典故故事(孙刚)——19 万岁
查看>>
修改hosts文件里面的主机名,oralce asm无法启动
查看>>
Maven学习总结(十)——使用Maven编译项目gbk的不可映射问题
查看>>
php5编译安装常见错误和解决办法集锦
查看>>
Linux远程访问及控制
查看>>
MongoDB实战系列之五:mongodb的分片配置
查看>>
Unable to determine local host from URL REPOSITORY_URL=http://
查看>>