【Java】equals和hashCode需要一起重写的原因

news2024/11/18 22:54:17

方法实现:

        equals和hashCode两个方法是属于Object基类的两个方法,我们先来看看两个方法的默认实现。

equals方法

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

        可以看到equals方法的默认实现是使用 == 比较两个对象,而对象使用 == 进行比较时比较的是两个对象在堆内存中的内存地址

hashCode方法

public native int hashCode();

        是native方法,不由Java实现,而是在运行时通过本地调用实现(默认是根据对象的内存地址生成),同时在文档中此方法有一个很重要的规范:If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result(如果两个对象通过equals方法比较后,结果是相等的,那么这两个对象分别调用hashCode方法必须得到相同的哈希码)。

        还有一个很重要的描述:It is not required that if two objects are unequal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce distinct integer results(如果两个对象通过equals方法比较后,结果不相等,这两个对象分别调用hashCode方法时也有可能产生相同的哈希码)。

小结

        1、经过equals方法比较后,两个对象相等,那么两个对象的哈希码一定相同。

        2、经过equals方法比较后,两个对象不相等,两个对象的哈希码不一定不相同。

方法验证:

User类

package test;
import lombok.*;

@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@ToString
public class User {

    private int id;

    private String name;

    
}

        (1)重写equals,不重写hashCode

重写equals方法

    @Override
    public boolean equals(Object obj) {
        if(this == obj)
            return true;

        if(!(obj instanceof User))
            return false;

        User user = ((User) obj);
        return (this.getId() == user.getId()) && (this.getName().equals(user.getName()));
    }

测试类

package test;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;

public class UserTest {
    public static void main(String[] args) {


        User user1 = new User(3,"邱淑贞");
        User user2 = new User(3,"邱淑贞");


        System.out.println(user1 == user2);
        System.out.println(user1.equals(user2));


        HashSet<User> set = new HashSet<>();
        set.add(user1);
        set.add(user2);

        Iterator<User> iterator = set.iterator();
        while (iterator.hasNext()){
            User user = iterator.next();
            System.out.println(user);
        }

        HashMap<User,String> map = new HashMap<>();
        map.put(user1,"test1");
        map.put(user2,"test2");
        System.out.println(map.get(user1));
        System.out.println(map.get(user2));
    }
}

测试结果

        1、==比较结果为false,因为比较的是对象的内存地址。

        2、equals比较结果为true,因为重写了equals方法实现,两个对象的字段都相同,判定为同一个对象。

        3、equals方法判定两个对象为同一对象,照理来说HashSet应该会进行去重操作,但迭代时仍然存在重复对象,这是因为HashSet是根据对象的哈希码进行去重操作,我们没有重写hashCode()方法,默认还是根据对象的内存地址生成哈希码。

        4、map分别存储了两个相同的对象,照理说map在调用get方法获取value时,会以最后一次put操作为准(map不允许key重复,使用相同key重复调用put方法会将value覆盖),但这里两个相同对象(equals比较相等,对象的hashCode也理应相等)却分别映射了不同的value,产生了歧义,而原因与上述一致。

        (2)既重写equals,也重写hashCode

重写hashCode方法

    @Override
    public int hashCode() {
        return this.name.hashCode();
    }

测试结果

        1、HashSet去重没有问题。

        2、HashMap同一对象映射同一个value,重复put操作以最后一次为准。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1389943.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Selenium使用指南(超详细)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 概述 selenium是网页应用中最流行的自动化测试工具&#xff0c…

Kafka-生产者

Kafka在实际应用中&#xff0c;经常被用作高性能、可扩展的消息中间件。 Kafka自定义了一套网络协议&#xff0c;只要遵守这套协议的格式&#xff0c;就可以向Kafka发送消息&#xff0c;也可以从Kafka中拉取消息。 在实践生产过程中&#xff0c;一套API封装良好、灵活易用的客…

C语言——详解字符函数和字符串数组(上)

目录 一、strlen的使用和模拟实现 1.strlen()函数的介绍 2.strlen()函数的具体使用 3.strlen函数的注意事项 4.strlen函数的模拟实现 二、strcpy的使用和模拟实现 1.strcpy()函数的介绍 2.strcpy()函数的具体使用 3.strcpy()函数的注意事项 4.strcpy函数的模拟实现 …

js逆向第19例:猿人学第17题天杀的Http2.0

文章目录 一、前言二、定位关键参数三、代码实现四、参考文献一、前言 任务十七:抓取这5页的数字,计算加和并提交结果 题目已经给出来标准答案,而且此题设置为“非常简单”其关键就是HTTP/2.0请求,打开控制台查看请求接口数据如下: 二、定位关键参数 可以看到控制台显示…

计算机毕业设计-----SSH学生请假管理系统

项目介绍 本项目分为管理员、教师、学生三种角色&#xff1b; 教师角色包含以下功能&#xff1a; 教师角色登录,请假查看,审批学生请假,学生管理等功能。 管理员角色包含以下功能&#xff1a; 班级管理,班主任管理,公告管理,留言板管理,学生管理等功能。 学生角色包含以下…

MySQL 中有关 NULL 的三个坑

mysql sum 函数、count 函数&#xff0c;以及 NULL 值条件可能踩的坑。 SELECT SUM(score) FROM person ; nullSELECT COUNT(score) FROM person; 0select id from person where scoreNULL; null 显然&#xff0c;这三条 SQL 语句的执行结果和我们的期望不同&#xf…

一篇文章带你搞懂---全排序

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 全排序&#xff08;Permutation&#xff09;是指将一组元素按照一定的顺序进行排列的过程。在计算机科学中&#xff0c;全排序是一…

Centos系统安全设置

1 设置密码复杂度&#xff0c;帐号密码有效期3个月 密码复杂度要求&#xff1a;最小长度8位&#xff0c;至少2位大写字母&#xff0c;1位小写字母&#xff0c;4位数字&#xff0c;1位特殊字符 1&#xff09;执行备份&#xff1a; #cp -p /etc/login.defs /etc/login.defs_bak…

zotero使用gpt

zotero使用gpt 下载 zotero下载&#xff1a;https://www.zotero.org/download/ 插件下载&#xff1a;https://github.com/MuiseDestiny/zotero-gpt?tabreadme-ov-file 插件安装 zotero中选择 工具->添加组件 选择右上角的齿轮&#xff0c;选择Install add-on from fil…

c++继承和派生(1)

目录 1.含义&#xff1a;从不同层面看的&#xff0c;同一种意思 2. 继承的使用场景 1. 共同之处 2. 迭代更新 3. 代码重构 3. 继承的基本语法 4. 继承了什么 1. 查看占用内存大小 2. 使用vs自带的功能查看类的内存分布 布局&#xff1a; 3. 结果 5. pr…

软件测试|使用Python提取出语句中的人名

简介 在自然语言处理&#xff08;NLP&#xff09;中&#xff0c;提取文本中的人名是一项常见的任务。Python作为一种流行的编程语言&#xff0c;拥有强大的NLP库和工具&#xff0c;使我们能够轻松地进行这项任务。在本文中&#xff0c;我们将使用Python示例来演示如何提取文本…

Linux第23步_安装windows下的STM32CubeProgrammer软件和安装 DFU驱动程序

STM32CubeProgrammer软件是通过USB3.0接口烧写系统软件。 STM32CubeProgrammer需要java运行环境&#xff0c;因此需要安装JAVA软件。 Java 运行环境版本必须是 V1.7 及以上&#xff0c;一定要用 64位的&#xff0c;和win系统一致&#xff0c;否则使用 STM32CubeProgrammer烧…

深入解析JavaScript中的函数绑定和命名函数表达式

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 函数是JavaScript中最重要的组成部分之一。但是函数的this绑定和作用…

Power Query 中常用的数据清洗、转换操作

&#xff08;一&#xff09;数据筛选、保留、删除、去重 1、数据筛选 操作步骤 选中列——点击列名右侧箭头——进行筛选 可选操作 勾选文本筛选器&#xff1a;等于/不等于、开头是/开头不是、结尾是/结尾不是、包含/不包含数字筛选器&#xff1a;等于/不等于、大于/大于等于…

harbor https

harbor https部署 准备docker-compose安装https 证书harbor安装访问harbor推镜像到harbor 准备 192.168.112.99&#xff0c;harbor&#xff0c;centos7 192.168.112.3&#xff0c;测试机&#xff0c;centos7 docker版本&#xff1a;docker-ce 20.10.16&#xff08;部署参考&a…

主流浏览器设置代理IP之搜狗浏览器

给浏览器设置代理IP是目前代理IP的主流使用场景之一&#xff0c;接下来小编就手把手教你如何对搜狗浏览器进行代理IP设置 注&#xff1a;本次使用IP来源于携趣代理平台 搜狗浏览器内设置IP代理 1、首先需要进入浏览器【设置】 2.点击【代理设置】选择【代理服务器设置】然后进…

ITE IT6801FNBX HDMI接收器 芯片

一、物料概述 IT6801FN是一款单端口HDMI接收器&#xff0c;可在HDMI1.4和MHL2.1双模式下工作&#xff0c;完全兼容MHL2.1、HDMI 1.4a、HDMI 1.4a3D和HDCP1.4&#xff0c;还可向后兼容DVI 1.0规格。IT6801FN具有深彩色功能&#xff08;高达36位&#xff09;&#xff0c;可确保接…

腾讯开源AI工具PhotoMaker,无需训练模型就能保持脸部一致随意换装。

腾讯开源AI工具PhotoMaker&#xff0c;无需训练模型就能保持脸部一致随意换装。 最近&#xff0c;AI文本到图像生成领域取得了显著进展&#xff0c;然而&#xff0c;现有的个性化生成方法已经无法同时满足用户的需求&#xff0c;这次腾讯发布了PhotoMaker框架&#xff0c;可以在…

IaC基础设施即代码:Terraform 通过后端使用 alicloud的OSS 实现资源管理

目录 一、实验 1.环境 2.Windows创建Terraform后端项目 3.Windows实例化Terraform后端项目 3.Windows给Terraform项目添加alicloud阿里云OSS &#xff08;实现代码与资源分离&#xff09; 4.Windows给Terraform项目添加封装的模块 5.Terraform通过后端使用 alicloud阿里…

价值7500的在线授权网站源码支持IP+域名+双向授权全开源

PHP授权验证更新系统完整版&#xff0c;一键更新系统&#xff0c;一键卡密生成自助授权功能&#xff0c;域名ip双重验证功能等等 修复盗版检测&#xff0c;确保实时查看盗版 修复在线加密系统&#xff0c;一键加密 授权系统几乎所有的程序都能整合使用,包括您的app和计算机程序…