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()内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring中AOP概念与两种动态代理模式原理详解

    Spring中AOP概念与两种动态代理模式原理详解

    AOP是面向切面编程的技术,AOP基于IoC基础,是对OOP的有益补充,流行的AOP框架有Sping AOP、AspectJ,这篇文章主要给大家介绍了关于Spring中AOP概念与两种动态代理模式原理的相关资料,需要的朋友可以参考下
    2021-10-10
  • 详细谈谈Spring事务是如何管理的

    详细谈谈Spring事务是如何管理的

    在使用传统的事务编程策略时,程序代码必然和具体的事务操作代码耦合,而使用Spring事务管理策略恰好可以避免这种尴尬,Spring的事务管理提供了两种方式:编程式事务管理和声明式事务管理,这篇文章主要给大家介绍了关于Spring事务是如何管理的相关资料,需要的朋友可以参考下
    2021-09-09
  • Java之数组在指定位置插入元素实现

    Java之数组在指定位置插入元素实现

    本文主要介绍了Java之数组在指定位置插入元素实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • IDEA中springboot提示java:找不到符号符号:变量log问题

    IDEA中springboot提示java:找不到符号符号:变量log问题

    这篇文章主要介绍了IDEA中springboot提示java:找不到符号符号:变量log问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • java仿百度假分页代码实现的详解

    java仿百度假分页代码实现的详解

    这篇文章主要介绍了java仿百度假分页代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • JAVA应用系统工具快捷托盘实例代码

    JAVA应用系统工具快捷托盘实例代码

    JAVA应用系统工具快捷托盘实例代码,需要的朋友可以参考一下
    2013-02-02
  • ASM源码学习之ClassReader、ClassVisitor与ClassWriter详解

    ASM源码学习之ClassReader、ClassVisitor与ClassWriter详解

    这篇文章主要给大家介绍了ASM源码之ClassReader、ClassVisitor与ClassWriter的相关资料,文中介绍的非常相信,相信对大家的学习或者工作具有一定的参考借鉴价值,有需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-01-01
  • 使用Feign调用第三方http接口

    使用Feign调用第三方http接口

    这篇文章主要介绍了使用Feign调用第三方http接口,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • springboot如何获取yaml/yml(或properties)配置文件信息

    springboot如何获取yaml/yml(或properties)配置文件信息

    在SpringBoot项目中,读取配置文件信息是常见需求,可以通过@Autowired注入Environment类,使用@Value注解直接注入配置信息,或定义工具类结合ApplicationRunner进行高级配置信息获取,特别提到
    2024-11-11
  • IntelliJ IDEA 刷题利器 LeetCode 插件详解

    IntelliJ IDEA 刷题利器 LeetCode 插件详解

    这篇文章主要介绍了IntelliJ IDEA 刷题利器 LeetCode 插件,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08

最新评论