首页 > 编程语言 >Java中为什么重写equals()也需要重写hashCode()?

Java中为什么重写equals()也需要重写hashCode()?

时间:2023-04-25 18:33:10浏览次数:47  
标签:Java name equals per hashCode 重写 public

所有类默认继承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()?

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,name,equals,per,hashCode,重写,public
From: https://www.cnblogs.com/odfive/p/17353516.html

相关文章

  • Java+GeoTools实现WKT数据根据EPSG编码进行坐标系转换
    场景Java+GeoTools(开源的JavaGIS工具包)快速入门-实现读取shp文件并显示:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/130367852在上面实现Java中集成Geotools之后,需求是将WKT数据转换成其他坐标系的WKT。比如说将EPSG:4524的坐标系转换成EPSG:2334的坐标系......
  • java获取当前程序路径
     publicstaticvoidmain(String[]args){{//获取当前程序路径的三种方法//1.SystemStringbaseDir=System.getProperty("user.dir");System.out.println(baseDir);//2.FileFile......
  • Java方法的返回值及注意事项
    方法的返回值为什么要有带返回值的方法呢?调用处拿到方法的结果之后,才能根据结果进行下一步操作带返回值方法的定义和调用:如果在调用处,要根据方法的结果去编写另一段代码逻辑为了在调用处拿到方法产生的结果,就需要定义带有返回值的方法1.带返回值方法定义的格式:public......
  • 基于java8构建Java项目
    需求:基于java:8-alpine镜像,将一个Java项目构建为镜像 实现思路如下:①新建一个空的目录(本例中为docker-demo-alpine)②拷贝docker-demo.jar到这个目录中,docker-demo.jar是一个简单JavaWeb项目打包成的jar文件。 ③编写Dockerfile文件在上面新建的目录中新建一个文件,命......
  • 开始java入坑之路
    Markdown学习标题:一级标题二级标题hello,word!hello,word!hello,word!hello,word! 引用zack 分割线图片 超链接ZACK列表abc a-空格bc 表格            代码​......
  • Java序列化和反序列化
    目录一、序列化和反序列化二、Java序列化演示三、反序列化漏洞一、序列化和反序列化1、含义​ 序列化就是内存中的对象写入到IO流中,保存的格式可以是二进制或者文本内容。反序列化就是IO流还原成对象。2、用途(1)传输网络对象(2)保存Session二、Java序列化演示1、序列化java......
  • java.lang.NoClassDefFoundError: org/apache/commons/io/output/UnsynchronizedByteA
    java.lang.NoClassDefFoundError:org/apache/commons/io/output/UnsynchronizedByteArrayOutputStream  一、问题现象在导出Excel过程中,程序报错如下:Exceptioninthread"main"java.lang.NoClassDefFoundError:org/apache/commons/io/output/UnsynchronizedByteArra......
  • javascript import maps 特性现已被全部主流浏览器支持
    值得庆祝Importmaps特性现在可以在全部三个主要浏览器内使用现在主流现代web应用引入和利用javascript是通过Esmodule模块实现。在开发javascript上,比起无模块化功能的旧版浏览器,现代浏览器支持模块化且提供了许多好用的功能引入esmodule使用<scripttype=“impor......
  • java8 lambda 求list最大值、最小值、平均值、求和、中位数、属性排序(空指针异常,空值
    点击查看代码importorg.junit.Test;importjava.text.SimpleDateFormat;importjava.util.*;importjava.util.stream.Collectors;importstaticjava.util.Comparator.comparingLong;importstaticjava.util.stream.Collectors.*;/***@Author:*@Date:2018/12......
  • java通过url得到文件对象(支持http和https)
    文字标题:java通过url得到文件对象(支持http和https)作者:锅巴1.场景:通过一个url地址来得到一个文件,此方式就是通过一个url将文件下载到本地的临时文件,直接上代码/***远程读取文件**@paramnetUrl*@return*/publicstaticFilegetNet......