对象差异比对核心是反射提取属性值并逐项比较:设field.setaccessible(true)绕过private限制,用objects.equals处理null;list批量对比优先按唯一键转map,再计算增删改;简单类型可用stream过滤求差。

用反射提取所有属性值
先拿到对象所有字段名和对应值,封装成 Map
按字段名逐一对比
把两个对象的字段名合并去重(用 Set),遍历每个字段名:
- 若某字段只在一个对象里存在,直接记为差异
- 若两边都有,用 Objects.equals(v1, v2) 比较(它自动处理 null)
- 不相等就记录字段名 + 两边的值,比如 "age: 25 → 30"
针对 List 里的对象做批量对比
如果要对比的是两个 List
- oldMap = oldList.stream().collect(toMap(User::getId, u -> u))
- newMap = newList.stream().collect(toMap(User::getId, u -> u))
- 新增:newMap.keySet 减 oldMap.keySet
- 删除:oldMap.keySet 减 newMap.keySet
- 更新:交集里取 key,再用 Objects.equals 比内容
简化场景可直接用 Stream
如果只是简单类型(如 List
- list1 中有但 list2 中没有:list1.stream().filter(x -> !list2.contains(x)).collect(toList())
- 反过来同理,再合并两个结果就是全量差异
- 注意:contains 效率低,大数据量建议先转 HashSet











