美文网首页Android
java比较两个对象内容是否相同

java比较两个对象内容是否相同

作者: lbcBoy | 来源:发表于2018-04-18 18:52 被阅读2514次

在我们的实际开发中,通常会认为两个对象的内容相等时,则两个对象相等,equals返回true。对象内容不同,则返回false。

可以总结为两种情况:

1、类未复写equals方法,则使用equals方法比较两个对象时,相当于==比较,即两个对象的地址是否相等。地址相等,返回true,地址不相等,返回false。

2、类复写equals方法,比较两个对象时,则走复写之后的判断方式。通常,我们会将equals复写成:当两个对象内容相同时,则equals返回true,内容不同时,返回false。

注意:用“==”比较的是引用的地址,用equals比较的就是值。Object类中的equals方法定义为判断两个对象的地址是否相等(可以理解成是否是同一个对象),地址相等则认为是对象相等。这也就意味着,我们新建的所有类如果没有复写equals方法,那么判断两个对象是否相等时就等同于“==”,也就是两个对象的地址是否相等。


问题:

1、假设对象的属性不定,那重写equals时肯定无法穷尽所以字段;

2、对象是第三方的引用,无法重写equals方法;

解决方式:

equals方法中使用反射获取所有字段的name和value,逐个对比;无法重写equal方法,就自己随便写一个,将要对比的对象作为入参丢进去;

参考代码1:比较

public StringBuilder compareContract(CreateContractSignInfoRequest sign, CreateContractSignInfoRequest existSign) {
    StringBuilder stringBuilder = new StringBuilder();
    try {
        Field[] fields = getAllFields(sign);
        for (int j = 0; j < fields.length; j++) {
            fields[j].setAccessible(true);
            // 字段值
            if (!fields[j].get(sign).equals(fields[j].get(existSign))) {
                stringBuilder.append(existSign.getUserName());
                stringBuilder.append(fields[j].getName() + "、");
            }
        }
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
    return stringBuilder;
}

参考代码2:获取所有属性

 /**
 * 获取所有属性,包括父类
 *
 * @param object
 * @return
 */
public Field[] getAllFields(Object object) {
    Class clazz = object.getClass();
    List<Field> fieldList = new ArrayList<>();
    while (clazz != null) {
        fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
        clazz = clazz.getSuperclass();
    }
    Field[] fields = new Field[fieldList.size()];
    fieldList.toArray(fields);
    return fields;
}

反射扩展:

(1)获取对象所属类的Class方法。

Class c = Class.forName("包.类名称");

(2)获得该类的所有Filed(不包括父类)。

Field[] fields = c.getDeclaredFields();

(3)将所有属性的访问权限设为true。
因为JavaBean中所有的属性访问权限都是private,所以无法直接获得所有属性,因此我们必须获得其访问权限,通过下面的方法完成:

setAccessible(true);

(4)输出对象属性

f.getField(对象名称);

(5)获取字段名

fields[j].getName()

(6)获取字段值

fields[j].get(obj)

相关文章

  • java比较两个对象内容是否相同

    在我们的实际开发中,通常会认为两个对象的内容相等时,则两个对象相等,equals返回true。对象内容不同,则返回...

  • JavaScript比较两个数组的内容是否相同

    比较两个数组内容是否相同 比较两个Object对象元素是否相同

  • 14.同一运算符

    is/is not 比较两个变量引用对象是否相同,即id/内存地址是否相同 == 比较两个变量引用对象的值是否相同...

  • Java中的== 和equals 以及 kotlin中的==和=

    Java == 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同...

  • 2016.6.12

    ruby的equal是比较两个对象是否相同,而java里String类的equal方法比较两个字符串对象的值是否相...

  • Java基础(1)

    java中==和equals和hashCode的区别 ==:运算符,比较变量是否相等,或者两个对象的地址值是否相同...

  • java 的对象比较

    本文探讨一下java对象之间比较的三种方式 概念 obj1 == obj2:比较两个对象的内存地址是否相同,即是否...

  • Python 基础 | 深入理解is和==的区别

    is和==的区别 is是比较两个对象在内存中地址是否相同 ==是比较两个对象的值是否相同,它调用的是对象的eq方法...

  • ===和==

    ==只比较内容是否相同;===还比较地址是否相同; //在swift中采用”==“对两个变量进行比较时,只要内容相...

  • java 比较两个对象是否相等

    java 中比较两个bean对象是否相同,可以有以下几种方法 重新实现hashcode()方法和equals()方...

网友评论

    本文标题:java比较两个对象内容是否相同

    本文链接:https://www.haomeiwen.com/subject/vjdbkftx.html