千家信息网

Java怎么比较两个对象并获取不相等的字段

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,这篇文章主要介绍"Java怎么比较两个对象并获取不相等的字段",在日常操作中,相信很多人在Java怎么比较两个对象并获取不相等的字段问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对
千家信息网最后更新 2025年11月07日Java怎么比较两个对象并获取不相等的字段

这篇文章主要介绍"Java怎么比较两个对象并获取不相等的字段",在日常操作中,相信很多人在Java怎么比较两个对象并获取不相等的字段问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Java怎么比较两个对象并获取不相等的字段"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

写在前面

在工作中,我们经常会遇到这样的需求--比较两个对象是否相等,如果不相等的话,取出不相等的字段。

以下这些场景都需要我们对一个对象进行比较:

  • 数据比对

  • 做单元测试断言对象是否相等

  • 前端要求对不相等的字段进行高亮显示

这种需求其实是非常简单的,但是如何优雅地解决这一类需求呢?

通常的做法是重写对象的 equals 方法。但是重写 equals 方法有很多缺点,例如:

  • 每次对象属性有变更,一定要记得再重写(放心,你一定会忘记的)

  • 每个对象只能有一个 equals 方法,但是可能你会需要不同的比对规则

  • 只能对比两个对象是否相等,无法具体知道哪个属性不等

  • 自动生成的 equals 方法无法基于 getter 方法进行比对

  • 对象来自第三方依赖,无法重写 equals 方法

因此,实现一个通用的比对器可以减少很多不必要的麻烦,帮助我们很好地完成这一类的需求。

缘起

我是在做数据同步的时候有这个需求,我要将数据库的数据通过一定的规则导入到 ES 中,导入完成之后,如何比对两边的数据是否一致呢?这时候一个好用的比对器就是我非常好的帮手。

另外,我在做单元测试的时候发现,经常会需要将被测方法的返回值和期望的结果做 assertEquals 断言这时这个比对器也非常有帮助。我发现很多同事经常会遇到类似的需求。

于是,我找时间自己实现了一下。

实现

使用反射对传入的对象进行比对,提供了基于字段的比较器和基于 Getter 方法的对比器,并且充分考虑扩展性,使用者可以重写字段的比对规则。功能相对简单,代码实现也不难,而且做了很多注释,具体实现可以直接查看源码。

UML图:

使用方法

因为已经上传到了 maven 仓库中,我们使用非常方便:

添加 maven 依赖

    com.github.dadiyang    equator    1.0.3

初始化并调用方法

Equator equator = new GetterBaseEquator();User user1 = new User(...);User user2 = new User(...);// 判断属性是否完全相等equator.isEquals(user1, user2);// 获取不同的属性List diff = equator.getDiffFields(user1, user2);

扩展

我们可以通过继承并重写 isFieldEquals 方法自定义比对规则,例如我们在做单元测试的时候,对于 Date 类型的字段的比对,通常数据库不保存毫秒数,而我们 new 出来的 Date 对象则包含了毫秒数,因此我们在对包含 Date 类型字段的对象做比对的时候需要忽略日期的毫秒数。这时就可以通过重写isFieldEquals 方法来自定义了:

/** * 日期在数据库不保存毫秒数,因此需要特殊处理,比对时间时,忽略毫秒数 * * @author dadiyang * @date 2019/3/23 */public class MmInsensitiveEquator extends GetterBaseEquator {    @Override    protected boolean isFieldEquals(FieldInfo fieldInfo) {        if (fieldInfo.getFirstVal() instanceof Date) {            Date first = (Date) fieldInfo.getFirstVal();            Date second = (Date) fieldInfo.getSecondVal();            if (Objects.equals(first, second)) {                return true;            }            // 忽略毫秒数            return Objects.equals(Math.round(first.getTime() / 1000), Math.round(second.getTime() / 1000));        }        return super.isFieldEquals(fieldInfo);    }}

到此,关于"Java怎么比较两个对象并获取不相等的字段"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

对象 方法 字段 数据 两个 需求 属性 时候 规则 学习 帮助 单元 常会 数据库 测试 不同 可以通过 日期 时间 更多 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 数据库清理缓存 怀旧服还有哪些服务器未开门 文翁大讲堂网络安全 电子政务办网络安全总结 数据和网络安全规章制度 服务器管理海量内存 优秀毕业论文 软件开发 辽阳软件开发哪家好 南京发票上传参数设置服务器地址 网络安全系统最新规定 不是本科生能学软件开发吗 幻塔悯雨岛服务器又叫什么 关于网络技术的求职信 网络安全巡查员如何监控 怎样申办网络安全研究所 涛思数据库手册 跟踪科技互联网股票的基金 数据库 取值唯一 网络安全风险最低是什么意思 sql数据库应用程序安全性警告 单机版游戏需要搭建服务器吗 网络安全协会第二次会员大会 七骑士现在还有什么服务器能玩 德宏互联网科技靠谱吗 五金商城软件开发公司 苹果总是出现无法验证服务器身份 qt文件存数据库 重庆众彩网络技术有限公司 广兴源互联网智慧科技园租金 国家医保数据库动态维护系统
0