java - equals()

weixin_33727510發表於2017-08-08
一 equals 方法

equals() 是超類Object 中的一個方法,用來比較兩個物件是否相等。

二 equals 和 ==

在 java 中所有的物件都有標識(記憶體地址)和狀態(資料),使用未重寫的 equals() 方法進行物件的比較 和使用 “==” 進行比較都是在比較兩個物件的記憶體地址是否相等,而不是它們的狀態(資料)是否相等。

未重寫的 equals 方法的原始碼:

public boolean equals(Object obj) {
    return (this == obj);
}

如果我們想要實現物件之間資料的比較,那麼我就應該要重寫 equals 方法。在 JDK 中,String、Math 等都已經對 equals 進行了重寫。所以我們在進行 String 的比較時,我們使用 equals 進行比較就是在對資料進行比較。

三 equals 的五大規則

  • 自反性
    任何非空引用值 x ,x.equals(x) 都返回 true
  • 對稱性
    對於任何非空引用值 x 和 y,當 x.equals(y) 等於 true 時,y.equals(x) 也必須等於 true
  • 傳遞性
    對於任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,並且 y.equals(z) 返回 true,那麼 x.equals(z) 應返回 true
  • 一致性
    對於任何非空引用值 x 和 y,多次呼叫 x.equals(y) 始終返回 true 或始終返回 false,前提是物件上 equals 比較中所用的資訊沒有被修改
  • 對於任何非空引用值 x,x.equals(null) 都應返回 false

四 不同的型別應該進行不同的比較方式


  1. 物件域,使用equals方法 。
  2. 型別安全的列舉,使用equals或== 。
  3. 可能為null的物件域 : 使用 == 和 equals 。
  4. 陣列域 : 使用 Arrays.equals 。
  5. 除float和double外的原始資料型別 : 使用 == 。
  6. float型別: 使用Float.foatToIntBits轉換成int型別,然後使用==。
  7. double型別: 使用Double.doubleToLongBit轉換成long型別,然後使用==。

相關文章