Java中为什么重写equals()也需要重写hashCode方法
更新时间:2023年04月26日 09:43:18 作者:武帅祺
这篇文章主要介绍了Java中为什么重写equals()也需要重写hashCode(),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
Java中为什么重写equals()也需要重写hashCode()?
所有类默认继承Object类 先看一下Object源码
package java.lang; public class Object { //默认调用本地的hashcode()方法 根据内存地址生成hash值 避免不了哈希冲突 public native int hashCode(); //默认调用的equals方法比较的是'=='比较 //基本类型比较的是两者的值是否相同 而引用类型比较两者的是引用地址(对象)是否相同 public boolean equals(Object obj) { return (this == obj); } }
结论
- equals()返回结果为true hashCode()一定相同
- '=='结果为true hashCode()一定相同
- '=='结果为false hashCode()有可能相同(哈希冲突)
hashCode()重写规范就是保证equals()相同的两个对象拥有相同的哈希值
回到刚刚哪个问题 为什么重写equals还要重写hashCode()?
关注公众号:Java技术迷,获取java相关书籍! public class per { private String name; private int age; public per(String name, int age) { this.name = name; this.age = age; } public boolean equals(Object o){ if (this==o)return true; if (o==null||o.getClass()!=this.getClass())return false; per o1 = (per) o; return o1.name==name&&o1.name!=null&&o1.name.equals(this.name)&&age=o1.age; } public int hashCode(){ return Objects.hash(name,age); } /* 这是Object类中的规范如果不同时重写将会导致很多类库出现业务不一致! 例如HashMap无法保证key值'唯一性' 下面测试代码p1和p2虽然地址不同 但是业务上看内容是相同的 所以应该只用一个key表示 但是不重写将无法正确插入! */ } class Example{ public static void main(String[] args) { per p1 = new per("张三", 18); per p2 = new per("张三", 18); HashMap<per,Integer> map = new HashMap<>(); map.put(p1,1); map.put(p2,2); //具体原理可以看put(k,v)源码! } }
到此这篇关于Java中为什么重写equals()也需要重写hashCode()?的文章就介绍到这了,更多相关Java 重写equals()为什么重写hashCode()内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
IDEA中springboot提示java:找不到符号符号:变量log问题
这篇文章主要介绍了IDEA中springboot提示java:找不到符号符号:变量log问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-04-04ASM源码学习之ClassReader、ClassVisitor与ClassWriter详解
这篇文章主要给大家介绍了ASM源码之ClassReader、ClassVisitor与ClassWriter的相关资料,文中介绍的非常相信,相信对大家的学习或者工作具有一定的参考借鉴价值,有需要的朋友可以参考借鉴,下面来一起看看吧。2017-01-01springboot如何获取yaml/yml(或properties)配置文件信息
在SpringBoot项目中,读取配置文件信息是常见需求,可以通过@Autowired注入Environment类,使用@Value注解直接注入配置信息,或定义工具类结合ApplicationRunner进行高级配置信息获取,特别提到2024-11-11IntelliJ IDEA 刷题利器 LeetCode 插件详解
这篇文章主要介绍了IntelliJ IDEA 刷题利器 LeetCode 插件,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-08-08
最新评论