Object類的equals方法

1、Object類中默認的實現(xiàn)方式是:return this == obj。也就是說,只有this和obj引用同一個對象的時候,才會返回true

2、equals方法需要滿足以下規(guī)則:
(1)、自反性:x.equals(x)應(yīng)該返回true;
(2)、對稱性: x.equals(y)為true,那么y.equals(x)也為true;
(3)、傳遞性:x.equals(y)為true,并且y.equals(z)為true,那么x.equals(z)也應(yīng)該為true;
(4)、 一致性: x.equals(y)的第一次調(diào)用為true,那么第二次、第三次、第n次調(diào)用也應(yīng)該為true,前提條件是在比較之前沒有修改x也沒有修改y;
(5)、對非空引用x, x.equals(null)返回false。

3、用一個demo簡單介紹一下equals方法的編寫

public class EqualsDemo
{
    private String name;
    private int age;

    public EqualsDemo()
    {
    }

    @Override
    public boolean equals(Object obj)
    {
        if (this == obj)
            return true;
        if ((obj == null) || (obj.getClass() != this.getClass()))
            return false;

        // 能執(zhí)行到這里,說明obj和this同類且非null。
        EqualsDemo p = (EqualsDemo) obj;
        return age == p.age && (name == p.name || (name != null && name.equals(p.name)));

    }
    
    @Override
    public int hashCode()
    {
        // 重寫equals,也必須重寫hashCode。具體后面介紹。
    }

}
  • EqualsDemo的對象有二個字段,name和age,這2個字段代表了對象的狀態(tài),也會用在equals方法中作為評判的依據(jù)。

  • 在equals方法中,首先將obj(傳入對象的引用)和this做比較,節(jié)約執(zhí)行時間,如果this 和 obj是 對同一個堆對象的引用,那么,他們一定是相等的。

  • 接著,判斷obj是否為null,如果是bull,一定不相等,因為既然當(dāng)前對象this能調(diào)用equals方法,那么它一定不是null,非null和null當(dāng)然不相等。

  • 然后,比較2個對象的運行時類,是否為同一個類。不是同一個類,則不相等。getClass返回的是 this 和obj的運行時類的引用。如果他們屬于同一個類,則返回的是同一個運行時類的引用。注意,一個類也是一個對象。

  • 也有人使用下面方法替代上面比較運行時類的寫法,應(yīng)該避免這樣做:

if(!(obj instanceof EqualsDemo))
     return false; // avoid 避免!

因為它違反了規(guī)則中的對稱性,例如;假設(shè)Dog類擴展了Animal類。這就會導(dǎo)致

animal.equls(dog) 返回true
dog.equals(animal) 返回false

僅當(dāng)EqualsDemo類沒有子類的時候,這樣做才能保證是正確的。

  • 按照第一種方法實現(xiàn),那么equals只能比較同一個類的對象,不同類對象永遠是false。但這并不是強制要求的。一般我們也很少需要在不同的類之間使用equals。

  • 在具體比較對象的字段的時候,對于基本值類型的字段,直接用 == 來比較(注意浮點數(shù)的比較,這是一個坑)對于引用類型的字段,你可以調(diào)用他們的equals,當(dāng)然,你也需要處理字段為null 的情況。對于浮點數(shù)的比較,我在看Arrays.binarySearch的源代碼時,發(fā)現(xiàn)了如下對于浮點數(shù)的比較的技巧:

if ( Double.doubleToLongBits(d1) == Double.doubleToLongBits(d2) ) //d1 和 d2 是double類型

if(  Float.floatToIntBits(f1) == Float.floatToIntBits(f2)  )      //f1 和 f2 是d2是float類型
  • 并不總是要將對象的所有字段來作為equals 的評判依據(jù),那取決于你的業(yè)務(wù)要求。比如你要做一個家電功率統(tǒng)計系統(tǒng),如果2個家電的功率一樣,那就有足夠的依據(jù)認為這2個家電對象等價了,至少在你這個業(yè)務(wù)邏輯背景下是等價的,并不關(guān)心他們的價錢啊,品牌啊,大小等其他參數(shù)。

  • 最后需要注意的是,equals 方法的參數(shù)類型是Object,不要寫錯!

注釋以上部分內(nèi)容來自:
lulipro

上一篇:ArrayList與LinkedList比較
下一篇:關(guān)于Object類的hashcode()方法的特點

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

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,637評論 18 399
  • 從三月份找實習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,787評論 11 349
  • 文章作者:Tyan博客:noahsnail.com | CSDN | 簡書 CHAPTER3 Method...
    SnailTyan閱讀 774評論 1 4
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,533評論 19 139
  • 修改代碼 file.func.php $index.php
    子木同閱讀 293評論 0 0

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