如何定义两个对象相等? --《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

从零开始用QP框架开发STM32:事件驱动编程实战指南(附状态机设计技巧)

本文详细介绍了如何使用QP框架在STM32上实现事件驱动编程,包括状态机设计技巧和嵌入式开发实践。通过对比传统前后台系统和RTOS,展示了QP框架在资源占用、实时性和代码可维护性方面的优势,并提供了从环境搭建到高级状态机设计的完整指南。

h6i7j8的博客 1173

java比较两个对象相同

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

weixin_40368322的博客 159

树莓派安装snowboy

1、树莓派换源 参考链接:https://blog.youkuaiyun.com/qq_43556844/article/details/113615915 2、更新pip3 参考链接:https://blog.youkuaiyun.com/qq_43556844/article/details/113616214 3、存取麦克风 我们使用PortAudio作为音频输入/输出的跨平台支持。我们还使用sox作为快速实用程序来检查麦克风设置是否正确。 sudo apt-get install python-pyaudio python

qq_43556844的博客 1923

Latex下使用JabRef添加参考文献

文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 Latex可以手动添加参考文献,但文献过多时,使用JabRef软件相对方便。 提示:以下是本篇文章正文内容,下面案例可供参考 一、JabRef安装 网址:http://www.jabref.org 打开网址后,点击“Download” 进入如下页面后,选择 portable (便携版,无需安装),下载后是一压缩包,打开即可使用。 二、使用 1.创建库 ...

sz3076799的博客 3467

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

PWM调节DCDC参数计算原理

SOC芯片的核电压、GPU电压、NPU电压、GPU电压等,都会根据性能和实际应用场景来进行电压和频率的调整。 即动态电压频率调整DVFS(Dynamic Voltage and Frequency scaling),优化性能和功耗。

电子绿洲的博客 3161

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

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

10万+

WRF-CHEM 新手向实践(四):化学初始/边界场及namelist设置

这是这个系列的最后一节了,这些经验是自己作为一个半路出家的外行一步步摸索出来的,其中不免有很多理解不到位的地方,但也正是如此,我相信这是目前新手入门wrf-chem最友好的教程之一,希望能对大家有实质性的帮助。本节继续未完成的内容。在mozbc生成化学初始和边界条件之前,还需要先在wrfinput文件中开启化学部分。

qq_42335815的博客 4636

思岚A1 上手教程

前言 寒假在家闲着也是闲着,索性就向是实验室借了一个思岚 A1激光雷达,来进一步完成自己的实验室实习项目。经过一个月在Linux上和ROS上的摸爬滚打,我已经对机器人开发和SLAM有了初步了解,现在就写个上手教程吧(以防自己以后忘了)。 Basic Support 硬件 一台电脑 思岚 A1激光雷达 软件 安装Virtual Box虚拟机 在虚拟机安装Ubuntu 16操作系统 在Ubuntu 16搭建ROS kinetic 简要步骤 1.现在w..

ajxdhe的博客 6384

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

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

weixin_39977934的博客 2326

Win10或Win8下ObjectARX2015 Wizard向导创建项目失败解决方法

[原创]objectARX 2015 Wizard安装向导在Win8/win10下无法创建项目的解决方法总结 by edata @2017-5-1 objectARX 2015 Wizard安装向导在Win8/win10下无法创建项目的解决方法 因为Win8/Win10对系统盘(默认c:)使用了高级权限管理,所以在此盘下操作文件的修改工作都需要管理员权限才行。 基于这个原因,导致非管理员安

edata的博客 7029

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

Cadence原理图设计10个高效技巧:从封装绑定到BOM表导出全流程

本文为硬件工程师提供了一套Cadence OrCAD Capture CIS原理图设计的高效实战指南。文章深度解析了从封装库的精准管理与CIS数据库绑定、封装批量处理技巧,到设计缓存清理、跨页信号追踪,再到关键的DRC检查、网表导出以及智能BOM报表生成的全流程核心技巧,旨在帮助工程师提升设计效率与可靠性,规避常见错误。

weixin_29178069的博客 201

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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

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

Tony-jiang的博客 6811

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

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

剑指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

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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、付费专栏及课程。

余额充值