Java中的equals和hashCode

这篇具有很好参考价值的文章主要介绍了Java中的equals和hashCode。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

equals

hashCode

equals和hashCode之间的关系

总结

equals

equals方法是Object类中用于检测两个对象是否相同的方法,Object类中实现的是两个对象引用是否相同的方法,看以下Object类中代码:

    public boolean equals(Object obj) {
        return (this == obj);
    }

可以看出来,Object类中equals方法本质上比较的还是两个对象的引用是否相同。也就是比较一个对象是否等于另一个对象。

class Student {
    public int age;
    public String name;

    public Student(int age, String name) {
        this.age = age;
        this.name = name;
    }
}
public class test02 {
    public static void main(String[] args) {
        Student student1 = new Student(18, "张三");
        Student student2 = new Student(18, "张三");
        System.out.println(student1 == student2);  //false
        System.out.println(student1.equals(student2));  //false
    }
}

可以看出,上述代码中创建了两个对象,然后分别用“==”和equals进行比较。

得出的结果都是相同的false。

原因就是所有的类默认都继承与Object类,当我们调用equals方法的时候,当前类并没有equals方法的实现,所以就调用了Object类中的equals方法。

当时Object类中的equals方法本质上还是采用“==”进行比较的。

“==”比较的如果是引用类型的话,就是比较的两个引用之间的地址是否相同。

但是可以看出上述代码中两个对象的各个属性都是相同的。

此时我们就需要重写equals方法了。

class Student {
    public int age;
    public String name;

    public Student(int age, String name) {
        this.age = age;
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }
}
public class test02 {
    public static void main(String[] args) {
        Student student1 = new Student(18, "张三");
        Student student2 = new Student(18, "张三");
        System.out.println(student1 == student2);  //false
        System.out.println(student1.equals(student2));  //true
    }
}

 可以看出当我们重写了Object的equals方法之后,两个对象进行比较的时候,结果就是true,因为两个对象中的各个属性都是相同的。

hashCode

hashCode方法的返回值是一个数值,返回的是一个对象具体的位置。

class Student {
    public int age;
    public String name;

    public Student(int age, String name) {
        this.age = age;
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(age, name);
    }
}
public class test02 {
    public static void main(String[] args) {
        Student student1 = new Student(18, "张三");
        Student student2 = new Student(18, "张三");
        System.out.println(student1 == student2);  //false
        System.out.println(student1.equals(student2));  //true
        System.out.println(student1.hashCode());
        System.out.println(student2.hashCode());
    }
}

Java中的equals和hashCode 

 可以看出这两个对象的hashCode码值是一样的。但是并不代表两个对象就是相同的同一个对象

equals和hashCode之间的关系

当两个对象的hashCode不同时,equals一定不相同。

当两个对象的hashCode相同时,两个对象的equals一定是true,但是不一定是同一个对象。

一定要同时重写 equals() 和 hashCode() 吗?

不一定:如果对象作为键在哈希表中,那么两个方法都要重写,因为put和get的时候需要用到哈希码值和equals方法,如果对象不在哈希表中,仅仅是用来判断是否相等,那么就重写equals方法就行了。

总结

Java基础真的很重要,所谓基础不牢,地动山摇。加油文章来源地址https://www.toymoban.com/news/detail-456302.html

到了这里,关于Java中的equals和hashCode的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java中的equals方法

    \\\"==\\\"是一个比较运算符。 \\\"==\\\"既可以判断基本类型,又可以判断引用类型。 \\\"==\\\"如果判断基本类型,判断的是值是否相等。eg: int i=10; double d=10.0 \\\"==\\\"如果判断引用类型,判断的是地址是否相等,即判定是不是同一个对象。 equals是object类中的方法,只能用于判断 引用类型 。 equa

    2024年02月03日
    浏览(37)
  • Java中的equals方法详解,Java中的toString方法

    先看文章目录,大致了解知识点结构,直接点击文章目录可以跳转到文章指定位置。 ①== 是Java中的比较运算符 ②比较基本类型时,比较的是双方的值 ③比较引用类型时,比较的是双方的地址值 比较结果如下:可以看到==比较的是引用类型数据的地址,想不比较地址就需要用

    2024年02月06日
    浏览(44)
  • Java 中的比较 equals 和 ==

    这个问题在 Java 面试的时候大概率会被问到。 不是因为这个问题有什么复杂的,只是因为这个地方超出人类认知,你相信吗? 如果你上培训班或者在学校学习的话,你的老师大概率可能会告诉你对于: 基本类型:比较的是值是否相同; 引用类型:比较的是引用是否相同;

    2024年02月09日
    浏览(35)
  • 一文详解java中的==和equals()

    目录 一、\\\"==\\\"运算符 二、\\\"equals()\\\"方法 三、举例说明和解释 3.1、例子 3.2、基本数据类型的比较 3.3、引用数据类型的比较     3.3.1 String类     3.3.2 未重写equals方法的类 四、为什么重写equals方法就一定要重写hashCode方法  4.1 为什么要重写equals方法 4.2 hashCode 4.3 为什么equas和ha

    2024年02月04日
    浏览(64)
  • 《Linux操作系统编程》 第六章 Linux中的进程监控: fork函数的使用,以及父子进程间的关系,掌握exec系列函数

    🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬

    2024年02月11日
    浏览(34)
  • PyTorch、OpenCV、YOLO间的关系

    PyTorch 是构建深度学习模型的框架,通常用于神经网络的训练,支持 GPU。预览版支持最新的CUDA12.1,如下图:  OpenCV 是一种专注图像处理、特征提取、物体检测、人脸识别的计算机视觉工具库。最新版OpenCV-4.7.0,如下图:   YOLO 是目标检测算法,是深度学习算法里的一种。

    2024年02月12日
    浏览(38)
  • LA@向量组间的表示关系

    向量组的相互表出 设有两个同维向量组 A : α 1 , ⋯   , α s A:alpha_1,cdots,alpha_s A : α 1 ​ , ⋯ , α s ​ , B : β 1 , ⋯   , β t {B}:beta_1,cdots,beta_{t} B : β 1 ​ , ⋯ , β t ​ 若 β 1 , ⋯   , β t beta_1,cdots,beta_t β 1 ​ , ⋯ , β t ​ 都可以被 A A A 线性表示,则称向量组 B {B} B 可以由

    2024年02月11日
    浏览(37)
  • 概率论与数理统计——事件间的关系

    事件A发生必然导致事件B发生。 代数中经常用这种方法证明两个事件相等。 A与B至少有一个发生 A与B同时发生 无限可列个:能按某种规律能把他排成一个序列(实变函数的概念) (1)自然数,(2)整数,(3)有理数 n个事件中任意两个都互不相容则称为两两互不相容 若A

    2024年02月09日
    浏览(46)
  • OpenCV 笔记(6):像素间的基本关系——邻域、邻接、通路、连通、距离

    像素是图像的基本元素,像素与像素之间存在着某些联系,理解像素间的基本关系是数字图像处理的基础。常见的像素间的基本关系包括:邻域、邻接、通路、连通、距离。 邻域表示了像素之间的连接关系。 像素(x,y)的 邻域 ,是指与像素(x,y)对应的点的集合{(x+p,y+q)} ,其中

    2024年02月04日
    浏览(44)
  • 城市数字化管理、智慧城市、数字孪生城市间的关系和演变

    基于《基于数字孪生的智慧城市》和《2023版数字孪生世界白皮书》,我们可以全面了解从数字城市管理到智慧城市,再到数字孪生城市的关系和发展历程。 以下是这一顺序和继承关系的要点总结: 这是城市地区向智慧城市演进的初始阶段。它涉及利用数字技术来管理和优化

    2024年02月04日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包