Hashcode 散列码

简介: 一个类A没有重写hashCode()方法,那么它使用Object的hashCode()方法生成散列码,即用对象的内存地址计算散列码。 所有有“Hash”字样的类都涉及到hashcode,如HashMap,HashSet。所以要使用这些容器存储对象,必须同时重写hashCode() 和equals()。否则一个类的两个对象objA 与objB,满足objA.equals(objB)为真,放

一个类A没有重写hashCode()方法,那么它使用Object的hashCode()方法生成散列码,即用对象的内存地址计算散列码

所有有“Hash”字样的类都涉及到hashcode,如HashMap,HashSet。所以要使用这些容器存储对象,必须同时重写hashCode() 和equals()。否则一个类的两个对象objA 与objB,满足objA.equals(objB)为真,放到HashSet<>容器中是不会自动去重的。

微笑问:如何编写hashCode()?

答:equals(Object obj)方法中用于比较的字段,都应该参与hashCode()的计算。也就是说,一个类的两个对象objA 与objB,若objA.equals(objB)为真,则objA.hashCode()==objB.hashCode()也应该为真。


注意hashCode的可变性。

HashMap在内部使用哈希表实现了对键的对应值的快速查找。但是这里也有一个小问题:支持哈希码的键依赖于可变字段的内容,这样容易产生 bug,即使最耐心的 Java 开发人员也会被这些 bug 逼疯。

下例中的 Person 对象有一个常见的 hashCode() ,它使用 firstName、lastName 和 age 字段 ( 所有字段都不是 final 字段 )计算 hashCode(),对 Map 的 get() 调用会失败并返回 null。


目录
打赏
0
0
0
0
14
分享
相关文章
HashCode相关
转帖,还是转帖 哈希码产生的依据:哈希码并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。也有相同的情况,看程序员如何写哈希码的算法。  下面给出几个常用的哈希码的算法。  1:Object类的hashCode.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。  2:Strin
1210 0
hashCode到底有什么用?
hashCode概念 hashCode是jdk根据对象的地址算出来的一个int数字,即对象的哈希码值,代表了该对象在内存中的存储位置。 我们都知道hashCode()方法是顶级类Object类的提供的一个方法,所有的类都可以进行对hashCode方法重写。
1099 0
hashcode详解
写这篇文章是因为在看hashMap源码时遇到有什么hashcode值,然后就去查,脑袋里面是有映像的,不就是在Object中有equals和hashcode方法嘛,这在学java基础的时候就遇到过,不过那时候无所谓,不懂就不懂,就一笔带过去了,然后到现在,又回过头来补本应该以前就搞清楚的问题,所以知道了一个道理,学习不是一个追求速度的事情,不懂就要去查清楚,弄明白,一步一个脚印,虽然刚开始可能会很慢,不过慢慢的,学习的多了,理解的多了,会越来越快的。越来越轻松,不至于现在还在补原来的知识。后悔也无事于补了,起码现在知道了这个道理,学习永远都不会迟,只要突然一天的醒悟,一切都会慢慢好起来的。  
137 0
浅析hashCode方法
一.问题引入       谈到hashCode就不得不说equals方法,二者均在Object类里,由于Object类是所有类的基类,所以一切类里都可以重写这两个方法。 要想较清晰的理解,需要先知道容器Collection,Set,list,Map(key值不可重复),Set元素无序...
952 0
hashCode和identityHashCode的区别你知道吗?
hashCode 关于hashCode参考之前的文章,点击参考之前文章。 identityHashCode identityHashCode是System里面提供的本地方法,java.lang.System#identityHashCode。
271 0
当hashCode相同时,equals是否也相同?
当hashCode相同时,equals是否也相同?
54 0
关于 equals 和 hashCode,看这一篇真的够了!
这几天在尝试手撸一个类似Lombok的注解式代码生成工具,用过Lombok的小伙伴知道,Lombok可以通过注解自动帮我们生产equals()和hashCode()方法,因此我也想实现这个功能,但是随着工作的深入,我发现其实自己对于equals()和hashCode()的理解,也处在一个很低级的阶段。
关于 equals 和 hashCode,看这一篇真的够了!
equals 和 hashCode 到底有什么联系?
写在前面 Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码。equals()和hashCode()都不是final方法,都可以被重写(overwrite)。
equals 和 hashCode 到底有什么联系?