Java|Java重写equals方法时为什么要重写hashCode方法( 二 )
Entry是一个静态内部类 , 有一个属性next , 指向下一个Entry , 形成一个链表结构 。
2、equals方法和hashCode方法看下面代码:
输出结果:
我们Student类重写了equals方法 , hashCode方法没有重写 , s1和s2的姓名和年龄相同 , equals方法为true , 认为是同一个人 。 但是s1和s2的hashCode返回不同 。
我们看下hashMap的get方法 , 先获取key的hashCode , 由于s1和s2的hashCode不同 , 所以hashMap.get(s2)得到的是null 。
接下来我们重写下Student类的hashCode方法 , 让equals方法和hashCode方法始终在逻辑上保持一致性 。
重新运行 , 输出结果如下 , s1和s2的hashCode相同了 , hashMap.get(s2)得到了1 。
① 在 Java 应用程序执行期间 , 在对同一对象多次调用 hashCode 方法时 , 必须一致地返回相同的整数 , 前提是将对象进行 equals 比较时所用的信息没有被修改 。 从某一应用程序的一次执行到同一应用程序的另一次执行 , 该整数无需保持一致 。
② 如果根据 equals(Object) 方法 , 两个对象是相等的 , 那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果 。
③ 如果根据 equals(java.lang.Object) 方法 , 两个对象不相等 , 那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果 。 但是 , 程序员应该意识到 , 为不相等的对象生成不同整数结果可以提高哈希表的性能 。
如果hashCode方法依赖于对象中易变的数据 , 用户就要当心了 , 因为此数据发生变化时 , hashCode()方法就会生成一个不同的hash值 。 看下面例子:
修改了age属性的值 , 导致hashCode变化 , 所以输出为“null” 。
因此 , 在设计hashCode方法和equals方法的时候 , 如果对象中的数据易变 , 则最好在equals方法和hashCode方法中不要依赖于该字段 。
欢迎小伙伴们关注转发点赞 , 谢谢~~
推荐阅读
- Java|Java项目搜索功能的实现
- Java|面试三年经验的程序员,感觉简历在造假!连个简单的题目都不会
- 游龙战神|-启动流程,好程序员Java培训分享SpringBoot
- 移动互联网|干了两年 Java,自考本科,15k,很难有机会进大厂?
- Java|一份好的 Java 开发简历,让面试官眼前一亮,到底长啥样?
- 引领先锋|/ PPTX,Java工程师福利!1分钟学会使用Aspose.PDF将PDF转换为PPT
- 马维英|我只相信数字!Java, 大数据,Python哪个前景更好,薪资更高?
- Java|5个主流的Java开源IDE工具
- 小米科技|6月份最受欢迎编程语言:Python取代Java,Rust进入前20名
- mp4|清华毕业扫地僧,用157集终于把java给讲完了,总计3.13GB