java中怎么比较两个自定义实体对象是否相等(比如在Set数据结构中去重)

2023-11-06

需求

有一个类Person,需要判断Account类的对象account1,account2是否相等。
判断规则为,当id(int类型判断是否带下相等)和department(判断字符串内容是否相等)属性均相等时(默认两个属性都必须非空,若有属性为空则认为两个对象不等),则认为该Account类对象相等。

public class Account{
	private int id;
	private String department;
}
Account account1 = new Account(1,"用户处");
Account account2 = new Account(1,"用户处");

以下开始介绍如何判断自定义类是否按照指定规则相等。

前提介绍

Java中所有类都继承自Object类,该类拥有equals方法,对象之间比较大小都是默认调用equals方法(可能会重写该方法),比如最常见的Integer或者String类对象,之间比较大小都是默认重写并调用了该方法。
下面的String,Integer源码解析,引用大佬文章,
Java Set对象去重
java.lang.Integer.equals():两个对象对应的值一致则返回true。

public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
}

java.lang.String.equals():两个字符串对应的值一致则返回true:

public boolean equals(Object anObject) {
    if (this == anObject) {//同一个对象,必定是一致的
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) {//对比每一个字符
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;//anObject不是String实例,那么返回false
}

而如果不重写该方法,默认调用的是java.lang.Object.equals()方法:两个对象的引用是否一致,即两个的对象是否是同一个。

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

但是我要比较自定义的值是否相等,并不希望是比较两者之间的引用是否相等,而是需要当判定他们的全部属性相等时则认为他们相等。

对于自定义对象进行比较

所以根据上面的先验知识,知道要对于自定义对象按照自定义规则比较是否相等,肯定得重写equals方法。
如下:

@Override
public boolean equals(Object object){
	if(object == null){
		return false;
	}
	if(object == this){
		return true;
	}
	if(object instanceof Account){
		Account account = (Account) object;
		try{
				if(account.id == this.id && account.department.equals(this.department)){
					return true;
				}
			}
		catch(Exception e){
			//对象的属性不全,则返回false
			return false;
		}
	}
	return false;
}

HashSet判断两个元素相等的标准是两个对象通过hashCode()方法返回的值相等并且两对象通过equals()方法比较相等,所以如果将对象输入在HashSet中,光是实现equals方法还是无法实现去重的效果,必须还得同时重写hashCode方法。
因为在HashSet插入新元素流程中,先根据hashCode方法获得对象的hashCode值,然后通过hashCode值计算得到hash值决定该对象在HashSet中的存储位置。
然后再通过equals比较,如果equals返回值为false,那两个元素还是不会被认定为同一元素,hashSet会在这个位置用链式结构保存新加入的元素。
hashCode方法如下:

@Override
public int hashCode(){
	try{
		return id.hashCode() + department.hashCode();
	}catch(Exception e){
		Random random = new Random();
		return random.nextInt(100);
	}
}

总结

如果想要实现自定义对象在HashSet实现自定义规则去重,需要重写自定义对象的hashCode和equals方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java中怎么比较两个自定义实体对象是否相等(比如在Set数据结构中去重) 的相关文章

  • 重构——套接字中的良好实践——简单的服务器-客户端 Swing 应用程序

    我使用单例和观察者模式编写了一个带有 Swing 接口的简单服务器 客户端程序 每个客户端都连接到服务器并可以发送消息 服务器将其收到的消息转发给其余的客户端 客户端使用 GUI 允许它们随时连接和断开与服务器的连接 该程序运行得很好 因为
  • 以点作为分隔符分割字符串

    我想知道我是否要在一个字符串上分割字符串 正确的方式 我的代码是 String fn filename split return fn 0 我只需要字符串的第一部分 这就是我返回第一项的原因 我问这个是因为我在 API 中注意到 意味着任何
  • WebLogic 10 中的临时目录

    每当 WL 停止时 它都不会删除其临时目录 即 domains mydomain servers myserver tmp WL TEMP APP DOWNLOADS domains mydomain servers myserver tm
  • 使用 JAXB 编组 LocalDate

    我正在构建一系列链接类 我希望能够将其实例编组到 XML 以便我可以将它们保存到文件中并稍后再次读取它们 目前我使用以下代码作为测试用例 import javax xml bind annotation import javax xml b
  • 从剪贴板获取图像 Awt 与 FX

    最近 我们的 Java FX 应用程序无法再从剪贴板读取图像 例如 用户在 Microsofts Paint 中选择图像的一部分并按复制 我不是在谈论复制的图像文件 它们工作得很好 我很确定它过去已经有效 但我仍然需要验证这一点 尽管如此
  • JAX-WS:有状态 WS 在独立进程中失败

    我在 Tomcat 上部署了一个有状态的 Web 服务 它由工厂服务和主要 API 服务组成 并且工作得很好 工厂服务将 W3CEndpointReference 返回到主 API 实例 客户端使用会话 现在 我尝试将相同的服务作为独立应用
  • 如何屏蔽 Protobuf 中的某些字段

    我找不到一种方法来屏蔽 protobuf 结构中的某些字段 我确实阅读了有关 FieldMaskUtil 的内容并尝试了几个示例 但它似乎做了相反的操作 即复制 FieldMask 中提到的字段 这与我想要的不同 这是示例结构和相应的测试代
  • 此版本不符合 Google Play 64 位要求,添加库后仍然出现错误

    我正在 Play 商店上传一个视频编辑器应用程序 其中包含带有一些本机代码的库 所以我通过将其添加到 gradle 来使其兼容 64 位 ndk abiFilters armeabi v7a arm64 v8a x86 x86 64 添加了
  • 如何使用 BufferedReader 对象从 Java 中的一行读取多个整数值?

    我正在使用 BufferedReader 类读取 Java 程序中的输入 我想读取用户的输入 该用户可以在带空格的单行中输入多个整数数据 我想读取整数数组中的所有这些数据 输入格式 用户首先输入他 她想要输入的数字数量 然后在下一行中使用多
  • 如何将txt文件添加到你的android项目中? [复制]

    这个问题在这里已经有答案了 我的Android studio版本是1 5 1 显然这个 never 版本没有 txt 文件的 asset 文件夹 您打算如何将这些文件包含到您的项目中 以及如何进一步使用您内部的应用程序 谢谢你的建议 Pro
  • 如何获取 Android 中临时文件的文件大小?

    如果我使用 openFileOutput 创建并写入临时文件 写入完成后如何获取文件大小 我希望这可以帮助你 File file new File selectedPath int file size Integer parseInt St
  • 尝试在空对象引用上调用虚拟方法“java.lang.String org.jsoup.nodes.Element.ownText()”

    我正在使用下面的代码来获取版本名称 from 应用商店通过使用 jsoup 我正在获取详细信息 但它引发了一些异常 我的代码是 public class ForceUpdateAsync extends AsyncTask
  • Java 类:匿名类、嵌套类、私有类

    有人能解释一下Java中匿名类 嵌套类和私有类之间的区别吗 我想知道与每个相关的运行时成本以及每个编译器的方法 这样我就可以掌握哪个最适合用于例如性能 编译器优化的潜力 内存使用以及其他 Java 编码人员的普遍可接受性 我所说的匿名类是指
  • Netty中连接关闭后重新连接的最佳方法是什么

    简单场景 扩展 SimpleChannelUpstreamHandler 的较低级别的类 A 此类是发送消息和接收响应的主力 系统其他部分可以使用顶级类 B 来发送和接收消息 可以模拟同步和异步 此类创建 ClientBootstrap 设
  • Hibernate @OneToMany 注释到底是如何工作的?

    我对 Hibernate 还很陌生 我正在通过教程学习它 我在理解到底如何一对多注释作品 所以我有这两个实体类 Student代表一个学生并且Guide代表指导学生的人 因此 每个学生都与一名向导相关联 但一名向导可以跟随多个学生 我想要一
  • C++ 中的 Java ArrayList [重复]

    这个问题在这里已经有答案了 在Java中我可以做 List
  • Java 8根据Map属性过滤Map对象列表以删除一些重复项

    Have a List
  • Java中的媒体播放器库[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在评估用于在 Java 中播放音频 视频的库 它不需要 100 Java Java 与本机库的绑定
  • SWT - 与操作系统无关的获取等宽字体的方法

    SWT 有没有一种方法可以简单地获得跨各种操作系统的等宽字体 例如 这适用于 Linux 但不适用于 Windows Font mono new Font parent getDisplay Mono 10 SWT NONE 或者我是否需要
  • Java:基于 Web 的应用程序中的单例类实例

    我在 Web Application 中有这个 Singleton 类 public class MyDAO private static MyDAO instance private MyDAO public static MyDAO g

随机推荐

  • jwt在线解密工具分享

    前言 之前调用一个第三方api的时候 看到需要在Authorization填写bearer token 英文不好 看成了熊 bear 心里很疑惑 实际上 bearer 指的是持票人 Bearer Token用于授权访问资源 任何Bearer
  • splunk之获取数据(Ingesting Data)

    Ingesting Data 下载数据地址 http splk it f1data use uname in the Username field and 5p1unkbcup for the Password field
  • GDB调试命令详解

    GDB是什么 调试程序 程序中出现的语法错误可以借助编译器解决 但逻辑错误则只能靠自己解决 实际场景中解决逻辑错误最高效的方法 就是借助调试工具对程序进行调试 所谓调试 Debug 就是让代码一步一步慢慢执行 跟踪程序的运行过程 比如 可以
  • Vue如何实现反向代理(配置proxy)

    Vue如何实现反向代理 那问题来了 反向代理是什么 反向代理 Reverse Proxy 实际运行方式是指以代理服务器来接受internet上的连接请求 然后将请求转发给内部网络上的服务器 并将从服务器上得到的结果返回给internet上请
  • Mysql的B+树高度计算

    问题 假设B 树的高度是2 一行数据的记录大小是1K 主键ID是int类型 问 该B 树存放的总记录数 知识点 Mysql的默认存储引擎是Innodb Innodb的最小存储单位是页 一页大小等于16K B 树的叶子节点存放数据 内部节点存
  • 黑马 Spring_day01

    Spring day01 今日目标 掌握Spring相关概念 完成IOC DI的入门案例编写 掌握IOC的相关配置与使用 掌握DI的相关配置与使用 1 课程介绍 对于一门新技术 我们需要从为什么要学 学什么以及怎么学这三个方向入手来学习 那
  • 计算机提示d3dcompiler43.dll缺失怎么修复,多个解决方法分享

    在游戏玩家中 遇到游戏提示找不到 d3dcompiler43 dll 文件的情况并不罕见 这使得许多玩家在启动游戏时感到困扰 因为这意味着他们可能无法正常运行游戏 那么 d3dcompiler43 dll 文件到底是什么呢 为什么游戏会提示
  • 数据库实现学生管理系统

    1 QT将数据库分为三个层次 1 gt 数据库驱动层 QSqlDriver QSqlDriverCreator QSqlDriverCreatorBase QSqlDriverPlugin 2 gt sql接口层 QSqlDatabase
  • 在剪贴板上有大量信息,是否保留其内容, 以便此后粘贴到其他程序中? VBA 对策

    在剪贴板上有大量信息 是否保留其内容 以便此后粘贴到其他程序中 对策a 是文件关闭前 随便复制一个空单元格就可以了 对策b Application DisplayAlerts False 关闭任何提醒 但复制的信息将仍旧保存在剪贴板中 对策
  • Qt数据库编程

    Qt数据库编程 版本说明 版本 作者 日期 备注 0 1 loon 2018 10 25 初稿 目录 文章目录 Qt数据库编程 版本说明 目录 一 需求和目的 二 使用说明 1 Qt 5 6 0的数据库操作类 2 Driver Layer
  • 堆栈指针SP

    1 什么是堆栈指针 在51系列单片机里 堆栈指针sp在片内RAM128B中开辟栈区 并随时跟踪栈顶地址 它是按 先进后出 的原则存取数据 开机复位后 单片机栈底地址为07H 主要用来保存临时数据 局部变量和中断 调用子程序程序的返回地址 堆
  • java的传值调用什么_Java的传值调用

    本文非引战或diss 只是说出自己的理解 欢迎摆正心态观看或探讨 引子 之所以写这篇文章是因为前些天写了一篇 Java中真的只有值传递么 探讨了网上关于Java只有值传递的说法 当时写这篇文章的缘由是因为之前看的文章讲解的Java只有值传递
  • pytorch基础学习笔记

    import torch import numpy as np def describe x print Type format x type print Shape size format x shape print Values n f
  • 第四题

    第四题 找MD5解密网址 ok
  • 【网络编程socket】java NIO编程示例以及流程详解

    文章目录 1 NIO架构图 2 服务端代码 3 客户端代码 4 运行 4 1 非nio客户端 4 2 nio客户端 参考 相关文章 网络编程socket 图解 Java NIO BIO MIO AIO 四大IO模型与原理 网络编程socke
  • 药品的泡罩包装技术介绍

    导读 药品的泡罩包装是通过真空吸泡 吹泡 或模压成型的泡罩内充填好药品后 使用铝箔等覆盖材料 并通过压力 在一定温度和时间条件下与成泡基材热合密封而成 药品的泡罩包装又称为水泡眼包装 简称为PTP Press through Packagi
  • 刷脸支付为消费者节省下时间和交易成本

    刷脸支付不仅是一种支付手段 更是一个基于刷脸的应用平台 它的意义完全不逊色于10年前移动支付的诞生 刷脸支付是脱离了私人终端 脱离了APP的一种核身支付方式 把两大巨头的支付业务拉到了同一个起跑线 因为微信在刷脸支付的战场上是去了核心优势
  • [Python人工智能] 十一.Tensorflow如何保存神经网络参数

    从本专栏开始 作者正式开始研究Python深度学习 神经网络及人工智能相关知识 前一篇详细讲解了Tensorflow Opencv实现CNN自定义图像分类案例 它能解决我们现实论文或实践中的图像分类问题 并与机器学习的图像分类算法进行对比实
  • 网联与线上支付

    网联的前世今生 网联系统始建于2016年 是独立于现有银行间支付清算机构的新平台 该平台只有清算功能 不做支付 也不发卡 平台由各个参与方自主共建 除了央行和支付清算协会以外 其余股东股份最高不超过10 防止被大型支付机构垄断 在第三方支付
  • java中怎么比较两个自定义实体对象是否相等(比如在Set数据结构中去重)

    需求 有一个类Person 需要判断Account类的对象account1 account2是否相等 判断规则为 当id int类型判断是否带下相等 和department 判断字符串内容是否相等 属性均相等时 默认两个属性都必须非空 若有