java比較兩個(gè)對(duì)象內(nèi)容是否相同

在我們的實(shí)際開(kāi)發(fā)中,通常會(huì)認(rèn)為兩個(gè)對(duì)象的內(nèi)容相等時(shí),則兩個(gè)對(duì)象相等,equals返回true。對(duì)象內(nèi)容不同,則返回false。

可以總結(jié)為兩種情況:

1、類未復(fù)寫equals方法,則使用equals方法比較兩個(gè)對(duì)象時(shí),相當(dāng)于==比較,即兩個(gè)對(duì)象的地址是否相等。地址相等,返回true,地址不相等,返回false。

2、類復(fù)寫equals方法,比較兩個(gè)對(duì)象時(shí),則走復(fù)寫之后的判斷方式。通常,我們會(huì)將equals復(fù)寫成:當(dāng)兩個(gè)對(duì)象內(nèi)容相同時(shí),則equals返回true,內(nèi)容不同時(shí),返回false。

注意:用“==”比較的是引用的地址,用equals比較的就是值。Object類中的equals方法定義為判斷兩個(gè)對(duì)象的地址是否相等(可以理解成是否是同一個(gè)對(duì)象),地址相等則認(rèn)為是對(duì)象相等。這也就意味著,我們新建的所有類如果沒(méi)有復(fù)寫equals方法,那么判斷兩個(gè)對(duì)象是否相等時(shí)就等同于“==”,也就是兩個(gè)對(duì)象的地址是否相等。


問(wèn)題:

1、假設(shè)對(duì)象的屬性不定,那重寫equals時(shí)肯定無(wú)法窮盡所以字段;

2、對(duì)象是第三方的引用,無(wú)法重寫equals方法;

解決方式:

equals方法中使用反射獲取所有字段的name和value,逐個(gè)對(duì)比;無(wú)法重寫equal方法,就自己隨便寫一個(gè),將要對(duì)比的對(duì)象作為入?yún)G進(jìn)去;

參考代碼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;
}

反射擴(kuò)展:

(1)獲取對(duì)象所屬類的Class方法。

Class c = Class.forName("包.類名稱");

(2)獲得該類的所有Filed(不包括父類)。

Field[] fields = c.getDeclaredFields();

(3)將所有屬性的訪問(wèn)權(quán)限設(shè)為true。
因?yàn)镴avaBean中所有的屬性訪問(wèn)權(quán)限都是private,所以無(wú)法直接獲得所有屬性,因此我們必須獲得其訪問(wèn)權(quán)限,通過(guò)下面的方法完成:

setAccessible(true);

(4)輸出對(duì)象屬性

f.getField(對(duì)象名稱);

(5)獲取字段名

fields[j].getName()

(6)獲取字段值

fields[j].get(obj)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 文章作者:Tyan博客:noahsnail.com | CSDN | 簡(jiǎn)書 CHAPTER3 Method...
    SnailTyan閱讀 776評(píng)論 1 4
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說(shuō)閱讀 12,431評(píng)論 6 13
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,578評(píng)論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 34,734評(píng)論 18 399
  • 文|余語(yǔ)于隅 才嫌暑氣盛,又怨冰霜欺。 晨寒遲遲起,慵慵懶梳洗。 最是閑暇時(shí),戀戀愛(ài)藤椅。 效法夸父事,殷勤而逐日。
    余語(yǔ)于隅閱讀 296評(píng)論 15 37

友情鏈接更多精彩內(nèi)容