JAVA对象一致性比较(属性值)
HashCode方法
该方法也是最为正规的方法,重写对象的hashCode与equals方法,可以实现对象间相等性比较的判断。
序列化方法
该方法是将A和B对象分为JSON序列化成字符串,利用字符串的来进行对象相等性比较。简单贴一下代码:
public static boolean seniorCompare(Object srcObject, Object dstObject) {
if (srcObject == null && dstObject == null) {
return true;
}
if (srcObject == null || dstObject == null) {
return false;
}
if (srcObject == dstObject) {
return true;
}
if (srcObject.getClass() != dstObject.getClass()) {
return false;
}
try {
String srcJson = JacksonJsonConverter.getInstance().serialize(srcObject);
String dstJson = JacksonJsonConverter.getInstance().serialize(dstObject);
boolean equals = srcJson.equals(dstJson);
if (equals) {
return true;
} else {
return false;
}
} catch (JacksonSerializeException e) {
e.printStackTrace();
}
return false;
}
反射比较
如果第一种方法无法成行,那该节介绍的反射则为常见的比较方式。通过反射获取对象的属性与值,依次进行数据的比较:
工具类主要实现判断对象是否一致和获取对象中不现的属性信息列表功能:
public List<BeanField> getDiffFields(Object first, Object second)
public List<BeanField> getDiffFields(Object first, Object second, List skipFields)
public boolean isEquals(Object first, Object second, List skipFields)
public boolean isEquals(Object first, Object second)
基本思路利用JAVA的反射,作了简单的封装,支持List/Map/基础类型/封装类型/复杂类型的比较。
代码如下:
package com.zte.sdn.oscp.topology.bean;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.Lists;
/**
* @Author 10184538
* @Date 2019/12/20 13:57
**/
public class BeanHelper {
private final Logger logger = LoggerFactory.getLogger(BeanHelper.class);
public static final List<Class<?>> WRAPPER = Arrays.asList(Byte.class, Short.class,
Integer.class, Long.class, Float.class, Double.class, Character.class,
Boolean.class, String.class);
private boolean isSimpleField(Object first, Object second) {
Object obj = first == null ? second : first;
Class<?> clazz = obj.getClass();
return clazz.isPrimitive() || WRAPPER.contains(clazz);
}
private List<BeanField> compareSimpleField(Object first, Object second) {
boolean eq = Objects.equals(first, second);
if (eq) {
return Collections.emptyList();
} else {
Object obj = first == null ? second : first;
Class<?> clazz = obj.getClass();
return Collections.singletonList(new BeanField(clazz.getSimpleName(), clazz, first, second));
}
}
private boolean nullIsEquals(Object first, Object second) {
if (first == null && second != null) {
return false;
}
if (first != null && second == null) {
return false;
}
return true;
}
public List<BeanField> getDiffFields(Object first, Object second, List<String> skipFields) {
if (first == second) {
return Collections.emptyList();
}
if (isSimpleField(first, second)) {
return compareSimpleField(first, second);
}
Object obj = first == null ? second : first;
Set<BeanField> diffField = new HashSet<>();
for (Field field : getFields(obj)) {
String fieldName = field.getName();
if (skipFields != null && skipFields.contains(fieldName)) {
continue;
}
try {
field.setAccessible(true);
Object firstVal = first == null ? null : field.get(first);
Object secondVal = second == null ? null : field.get(second);
if (firstVal == secondVal) {
continue;
}
BeanField fieldInfo = new BeanField(fieldName, field.getType(

本文探讨了三种JAVA对象一致性比较方法:通过重写hashCode和equals方法,使用序列化比较对象,以及利用反射获取并比较对象属性。还提供了一个工具类实现反射比较,支持多种类型的数据比较。
&spm=1001.2101.3001.5002&articleId=103641184&d=1&t=3&u=7207cca2d7ff4869883b117328713b7f)
528

被折叠的 条评论
为什么被折叠?



