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中根据数据库自动生成实体类

    图文讲解IDEA中根据数据库自动生成实体类

    这篇文章主要以图文讲解IDEA中根据数据库自动生成实体类,本文主要以Mysql数据库为例,应该会对大家有所帮助,如果有错误的地方,还望指正
    2023-03-03
  • Java BeanDefination接口详细讲解

    Java BeanDefination接口详细讲解

    BeanDefinition是spring里面bean的一个建模对象,就相当于class对象是普通java对象的建模对象一样。可能在spring作用的各种业务场景中,class对象并不能完成spring对bean的抽象,所以弄了一个BeanDefinition作为bean的抽象建模对象
    2022-11-11
  • java实现图片写入高清字体及带边框的方法

    java实现图片写入高清字体及带边框的方法

    这篇文章主要介绍了java实现图片写入高清字体及带边框的方法,涉及java针对图片及文字的相关操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • SpringBoot自动配置原理详解

    SpringBoot自动配置原理详解

    SpringBoot的诞生就是为了简化Spring中繁琐的XML配置,其本质依然还是Spring框架,使用SpringBoot之后可以不使用任何XML配置来启动一个服务,使得我们在使用微服务架构时可以更加快速的建立一个应用。本文将为具体介绍一下SpringBoot的原理,需要的可以参考一下
    2021-12-12
  • SpringBoot搭建全局异常拦截

    SpringBoot搭建全局异常拦截

    这篇文章主要介绍了SpringBoot搭建全局异常拦截,本文通过详细的介绍与代码的展示,详细的说明了如何搭建该项目,包括创建,启动和测试步骤,需要的朋友可以参考下
    2021-06-06
  • springboot之Validation参数校验详细解读

    springboot之Validation参数校验详细解读

    这篇文章主要介绍了springboot之Validation参数校验详细解读,本篇是关于springboot的参数校验知识,当然也适用其它java应用,读完本篇将学会基本的参数校验,自定义参数校验和分组参数校验,需要的朋友可以参考下
    2023-10-10
  • java提供的4种函数式接口

    java提供的4种函数式接口

    这篇文章主要介绍了java提供的4种函数式接口,函数接口是只有一个抽象方法的接口,用作 Lambda 表达式的类型并有且只有一个抽象方法的接口,下文详细内容,需要的小伙伴可以参考一下
    2022-03-03
  • Spring Boot项目添加外部Jar包以及配置多数据源的完整步骤

    Spring Boot项目添加外部Jar包以及配置多数据源的完整步骤

    这篇文章主要给大家介绍了关于Spring Boot项目添加外部Jar包以及配置多数据源的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-06-06
  • Java 读取、获取配置文件.properties中的数据

    Java 读取、获取配置文件.properties中的数据

    这篇文章主要介绍了Java 读取、获取配置文件.properties中的数据,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-09-09
  • idea生成类注释和方法注释的正确方法(推荐)

    idea生成类注释和方法注释的正确方法(推荐)

    这篇文章主要介绍了idea生成类注释和方法注释的正确方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11

最新评论