如何定义两个对象相等? --《JAVA编程思想》 69

做了5年Java,java编程思想第四版答案 专题1:JavaOOP 1、什么是B/S架构?什么是C/S架构 2、Java都有哪些开发平台? 3、什么是JDK?什么是JRE? 4、Java语言有哪些特点 5、面向对象和面向过程的区别 6、什么是数据结构? 7、Java的数据结构有哪些? 8、什么是OOP? 9、类与对象的关系? 10、Java中有几种数据类型 11、标识符的命名规则。 12、instanceof关键字的作用 13、什么是隐式转换,什么是显式转换 14、Char类型能不能转成int类 阅读详情

我们在对非基本类型进行比较时,往往需要重写 equals() 方法来判断两者是否相等。

比如我们现在定义一个 Student 类,希望只要其 number 相等,就认为这是同一个 Student。

public class Student {

    private int number;

    private String name;

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

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student{" +
                "number=" + number +
                ", name='" + name + '\'' +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        Student student = (Student) o;
        if (number == student.getNumber()) {
            return true;
        }
        return false;
    }

}
public class StudentTest {

    public static void main(String[] args) {
        Student s1 = new Student(1, "王小明");
        Student s2 = new Student(1, "王大明");
        System.out.println(s1.equals(s2));
    }

}
true

咋一看好像没啥问题,但我们把 Student 放入 Set 中再看看。

public class StudentTest {

    public static void main(String[] args) {
        Student s1 = new Student(1, "王小明");
        Student s2 = new Student(1, "王大明");
        Set<Student> set = new HashSet<>();
        set.add(s1);
        set.add(s2);
        System.out.println(set);
    }

}
[Student{number=1, name='王大明'}, Student{number=1, name='王小明'}]

我们发现即使两者通过 equals() 返回 true,代表两者相等,但放入 Set 中时,还是被认为是两个不同的对象。

但我们的想法是,希望相同 number 的 Student 放入 Set 时,可以被认作为同一个 Student ,该如何操作呢?

其实在 Set 中,判断 key 是否重复,不仅仅是通过调用 equals() 方法来判断两者是否相等,还需要判断 hashcode() 方法返回的值是否一致。

我们只需重写 Student 的 hashCode() 方法,让相同编号的 number 返回相同的值即可。之后再将 number 相同的 Student 放入 Set 时,就会被认作为重复元素,不会再执行更新操作。

public class Student {

    private int number;

    private String name;

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

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student{" +
                "number=" + number +
                ", name='" + name + '\'' +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        Student student = (Student) o;
        if (number == student.getNumber()) {
            return true;
        }
        return false;
    }

    @Override
    public int hashCode() {
        return getNumber();
    }
    
}
public class StudentTest {

    public static void main(String[] args) {
        Student s1 = new Student(1, "王小明");
        Student s2 = new Student(1, "王大明");
        Student s3 = new Student(1, "王二明");
        Set<Student> set = new HashSet<>();
        set.add(s1);
        set.add(s2);
        set.add(s3);
        System.out.println(set);
    }

}
[Student{number=1, name='王小明'}]

本次分享至此结束,希望本文对你有所帮助,若能点亮下方的点赞按钮,在下感激不尽,谢谢您的【精神支持】。

若有任何疑问,也欢迎与我交流,若存在不足之处,也欢迎各位指正!

31. 创建两只相同的对象 创建两只相同的对象 阅读详情

相关推荐

java 判断集合是否相等时只须关注元素是否相等即可

package com.zcw1.demo69; import java.util.ArrayList; import java.util.Vector; /** * @program: 151 * @description: java 判断集合是否相等时只须关注元素是否相等即可 * @author: zhaocunwei * @create: 2019-12-18 15:55 */...

知识改变命运,ヾ(◍°∇°◍)ノ゙【求关注】 416

两个对象相等(==、equals、hashCode)详解

一文让你彻底明白 == 与 equals 的区别,hashCode 到底是啥,hashCode 又和 equals 有怎样的关系

m0_54355172的博客 3444

Zynq 双核AMP 通信

4、配置离线编译(这里不讲),配置linux的内核地址空间(0x4000_0000改为0x2000_0000),以及单核启动。CPU1设置为0x2000_0000~0x3FFF_FFFF(也可以小于0x3FFF_FFFF)如果禁用CPU1的L2 cache,在CPU1的bsp里面添加编译时候所需要的宏。3、配置工程,将vivado产生的.xsa文件复制到amp_com项目目录下。9、使用petalinux-package --boot 打包。一、vivado工程。5、编译u-boot。

y183128184的博客 1086

java比较两个对象相同

如何实现Java比较两个对象相同 1. 整体流程 首先,我们需要知道Java中比较两个对象相同的方法。一般来说,我们可以通过重写对象的equals()方法来实现对象的相同比较。下面是整个流程的步骤表格: 步骤 操作 1 创建一个类,实现equals()方法 2 在equals()方法中,判断两个对象是否相...

weixin_40368322的博客 159

vivado下ECO操作-不重新综合实现修改属性并生成.bit

ECO即engineer change order,即工程变更指令,可以对设计做局部小改动并只对改动部分重新布局布线并生成.bit。在一个工程动辄编译几个小时情况下,可以在调试中节省大量时间。比如我们在调试中,需要改变时钟占空比或者相位,需要改变寄存器初值等等,此时用ECO暂时改动,待验证后在重新编译无疑是最有效率的方法。 实现ECO通常有两种方式,一是通过vivado界面完成,另一种方法就是tcl脚本。所有的ECO操作都可以通过tcl操作完成,有的操作用vivado界面无法完成,只能通过tcl。以下主要

4657

基于deepseek本地模型的本地知识库构建

通过以上步骤,你已经成功构建了一个基于 AnythingLLM 和 LM Studio 的本地知识库。这个系统不仅能够高效地存储和检索知识,还能结合强大的语言模型生成准确的回答。你可以根据自己的需求进一步扩展和优化这个系统,比如增加更多的文档格式支持、优化检索算法等。

qq_30178745的博客 1383

Java String 对象剖析

在ChinaUnix上看到篇帖子,感觉满深刻。 起因:String a="Hello World!";String b="Hello World!";a=b?  a和b是否相等 ? 为什么?String a=new String("Hello World!");String b="Hello World!";a=b?  a和b是否相等 ? 为什么? 解释:1. 首先Stri

追逐梦想 1063

Dify-前端本地运行-单点登录

本文介绍了如何在已部署Dify的系统中实现AI应用跳转及页面定制化改造。通过iframe跳转无法满足甲方需求后,作者对Dify前端源码进行了本地化二次开发,主要步骤包括:1) 按照官方文档搭建本地开发环境;2) 修改.env配置文件连接部署好的后端服务;3) 隐藏侧边栏和头部导航栏;4) 实现单点登录功能,通过URL参数获取用户邮箱自动登录。过程中解决了请求拦截导致的登录校验问题,最终达成仅保留对话框界面并同步用户信息的需求。该方案涉及Next.js框架和React技术的应用,为类似定制化需求提供了参

weixin_43163457的博客 3224

Java中如何判断两个对象是否相等(Java equals and ==)

原文:https://www.dutycode.com/post-140.html 如何判断两个对象相等,这个问题实际上可以看做是如何对equals方法和hashcode方法的理解。 从以下几个点来理解equals和hashCode方法: 1、equals的作用及与==的区别。 2、hashcode的作用及与equals的关系。 1、equals的作用及与==的区别。

10万+

从编解码芯片看Tesla T4的隐藏实力:双NVDEC如何实现70路1080P解码?

本文深入剖析了英伟达Tesla T4显卡的隐藏实力,重点解读其独特的双NVDEC硬件解码器设计如何突破性能瓶颈。通过分析Turing架构、对比HEVC/H.264解码差异,并结合驱动与SDK优化,揭示了实现高达70路1080P视频流并发解码的原理与实战配置,为云游戏、直播转码等高并发场景提供高效解决方案。

weixin_29209801的博客 485

信号处理领域的研究生看过来:手把手教你搞定ICASSP 2025论文投稿(附Latex模板与格式检查清单)

本文为信号处理领域研究生提供ICASSP 2025论文投稿的详细指南,涵盖Latex模板使用、格式检查清单及投稿流程。特别针对IEEE旗舰会议的严格要求和2025年可能出现的新变化,提供预判性建议和实战技巧,帮助作者高效完成论文投稿。

程涛 561

java 比较两个集合_java怎么比较两个list是否相同?

展开全部首先这里需要确定一下集合相等32313133353236313431303231363533e78988e69d8331333363396464的定义,我们应该是认为两个集合的元素完全一致则相等。那么判断可以这样做:一判断两个list集合的元素个数是否相等。如果不相等则两个list集合也不相等,判断结束,如果相等则进入第二步判断二判断list1的元素是否全部在list2中。遍历list1,...

weixin_39977934的博客 2326

零基础实战:云开发家政维修小程序搭建指南

欢迎来到这本关于构建家政维修小程序的电子书!在当今数字化的浪潮中,线上服务已成为我们生活中不可或缺的一部分。从点餐购物到居家维修,人们越来越习惯通过指尖轻点来解决各种需求。正是基于这样的背景,我们希望通过这个系列,手把手地带领大家从零开始,搭建一个功能完备、体验流畅的家政维修平台。这不仅仅是一本技术教程,更是一次将想法变为现实的探索之旅。我们将深入浅出地讲解如何运用云开发等现代技术,实现从用户下单、支付,到客服派单、工人接单,再到订单完成和权限管理等一系列核心业务流程。

低代码布道师的博客 3431

scala 判断对象相等/equals

1 package scala_enhance.scalaextends 2 3 import scala.collection.mutable.HashMap 4 5 /** 6 * scala中判断对象相等 7 * 原则: 8 * 如果两个对象相等,那么其hashcode必定相同,所以重写equals方法,要重写hashcode(默认情况下hashc...

weixin_30586257的博客 786

VB.net:VB.net编程语言学习之ADO.net基本名称空间与类的简介、案例应用(实现与SQL数据库编程案例)之详细攻略

ADO.net有六个基础名称空间,除此之外,每个新的数据提供程序还可以有自己的名称空间,如Oracle。在.net中就提供了System.Data.OracleClient名称空间(用于Microsoft建立的Oracle数据库提供的程序)ADO.net体系结构的另一个核心元素是.Net数据提供程序(Data Provider),它的组件用于进行数据处理(和DataSet的数据访问功能相对应)。:是ADD.net核心名称空间,它包含所有数据提供程序使用的类,这些类表示表、列、行,还有DataSet类;

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 1732

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对

答:不对,有相同的 hash code这是java语言的定义:1) 对象相等则hashCode一定相等;2) hashCode相等对象未必相等 hashCode 的常规协定是: (1)在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的

Tony-jiang的博客 6811

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

剑指Offer打卡day27—— AcWing 69. 数组中数值和下标相等的元素

【题目描述】 AcWing 69. 数组中数值和下标相等的元素 【思路】 二分 下标: 0 1 2 3 4 数值:-3, -1, 1, 3, 5 假设目标是x,可以发现左边元素值小于下标 ,右边元素大于下标。 class Solution { public int getNumberSameAsIndex(int[] nums) { if(nums == null || nums.length == 0) return -1; int l = 0, r =

JohnnyLin 188

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

java11从list中取出某个属性_java根据对象属性从对象列表中取出对象

展开全部packagetest;importjava.beans.IntrospectionException;importjava.beans.PropertyDescriptor;importjava.lang.reflect.InvocationTargetException;importjava.lang.reflect.Method;importjava.util.Array...

weixin_39878247的博客 1320

[javase学习笔记]-4.2 定义函数的两个明确

这一节我们学习在实际开发中如何定义一个函数,也就是如何定义一个功能. 要定义一个功能,就要用两个明确来完成: 明确一:这个功能的结果是什么; 明确二:这个功能实现过程中是否需要未知内容参与运算. 我们直接看下面代码: class FunctionDemo2 //两个明确 { public static void main(String[] args) { int num = 6

fbl_csdn的博客 828

String创建的对象存在哪里

直接放测试代码: String a = "asdadas"; String b = "asdadas";//在堆中 每次创建地址不一样 System.out.println(a.getBytes()); //1 System.out.println(b.getBytes()); //2 St...

a的博客 4692

leetcode第69题Sqrt(x).java – day01

leetcode第69题Sqrt(x).java – day01 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。 示例 1: 输入:x = 4 输出:2 示例 2: 输入:x = 8 输出:2 解释:8 的算术平方根是 2.82842…, 由于返回类型是整数,小数部分将被舍去。 提示: 0 <= x <= 231 - 1

m0_47550310的博客 6914

java 对比类_Java重要技术(30)类加载器之Class类型的相等比较

1.1.class类的相等比较对于class类的对象,只有由相同的类加载器加载,并且类名相同,才是相同的class。同时,对于类的委托加载机制,可以遵循,也可以不遵循。定义Hello类。packagecom.test.javatechnology.classloader.test;//位于test目录中。public classHello {}定义类加载器。/*** @Title: Specia...

weixin_30972131的博客 415

UUID类型如何比较是否相等

直接使用equals方法 UUID x = UUID.fromString("062db347-6a72-69a1-40c0-7516e0a26459"); UUID y = UUID.fromString("062db347-6a72-69a1-40c0-7516e0a26459"); System.out.println(x.equals(y)); 输出结果为:true ...

weixin_30426879的博客 640

java实现双人摇骰子_写一个java程序,摇两个骰子,用random,直到两个值相等为止...

展开全部不知道你说的e69da5e887aa3231313335323631343130323136353331333363353834是random类还是math.random,所以写了两个1. Math.randompublicclassTest1{publicstaticvoidmain(String[]args){inta,b;a=(int)(1+Math.rand...

weixin_42554394的博客 721

java程序员简历永远不要写精通,哪怕是面向对象,请看这108题

1、什么是B/S架构?什么是C/S架构 B/S(Browser/Server),浏览器/服务器程序 C/S(Client/Server),客户端/服务端,桌面应用程序 2、Java都有那些开发平台? JAVA SE:主要用在客户端开发 JAVA EE:主要用在web应用程序开发 JAVA ME:主要用在嵌入式应用程序开发 3、什么是JDK?什么是JRE? JDK:java development ...

程序员小羊的博客 6139
上一篇: List类的实用方法 --《JAVA编程思想》 68
下一篇: ArrayList和LinkedList该如何选择? --《JAVA编程思想》 70
BaymaxCS
博客等级 码龄9年 61粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BaymaxCS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值