java中equal方法總結

  場景:本週在完成一個公司業務功能時,在判斷是否爲代叫單時調用了equal方法:html

PublishOrderType.HELP_ORDER.equals(valetOrderExtraInfoDO.getHelpFlag())

HELP_ORDER爲枚舉變量,比較的getHelpFlag()返回值爲Integer,使得全部狀況都返回false,致使業務邏輯錯誤java

  分析緣由:equal爲java的Object中的方法,所以除了基本類型外其餘全部類型均可以調用,Object中方法定義以下:數組

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

當不一樣類型進行比較時,若是不是能夠隱式轉換,通常返回false。比較時應當比較枚舉型的code,代碼以下:安全

PublishOrderType.HELP_ORDER.getCode().equals(valetOrderExtraInfoDO.getHelpFlag())

  equal方法:this

  你們都知道,對於內置類型,使用==兩邊的值大小,而對於超類Object派生的類型,與==相比,equal方法比較的是內容,而==比較的內存地址,java中JDK提供的經常使用類都equal方法進行了重寫,好比:spa

枚舉類Enum:code

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

整型類Integer:htm

public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
}

雙精度浮點類Double:對象

 public boolean equals(Object obj) {
     return (obj instanceof Double) && (doubleToLongBits(((Double)obj).value) == doubleToLongBits(value));
}

字符串類String:blog

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String) anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                            return false;
                    i++;
                }
                return true;
            }
        }
        return false;
}

注意:上面判斷是否是同一個類是使用的是instanceof,這個詞的含義是判斷其左邊對象是否爲其右邊類的實例或者子類的實例,而上面的幾個類在定義時使用了final,也就是說不容許繼承,所以可使用該關鍵字,在本身編寫equal方法時,須要使用.getClass() == this.getClass()判斷類型是否一致;

  equal方法有如下五個性質:

  1. 自反性
  2. 對稱性:無論誰調equal方法都不會影響結果
  3. 傳遞性
  4. 一致性:屢次比較不會影響判斷結果
  5. 任何非空對象與調用equal(null)均返回false

  java中須要選用合適的方法比較

  1. 對象域,使用equals方法 。
  2. 類型安全的枚舉,使用equals或== 。
  3. 可能爲null的對象域 : 使用 == 和 equals 。
  4. 數組域 : 使用 Arrays.equals 。
  5. 除float和double外的原始數據類型 : 使用 == 。
  6. float類型: 使用Float.floatToIntBits轉換成int類型,而後使用==。
  7. double類型: 使用Double.doubleToLongBit轉換成long類型,而後使用==。

  總的來講:類通常調用equal判斷,固然首先須要對類進行判空,除了float和double以外的內置類型直接使用==進行內容比較,而float和double使用Float和Double的方法比較,也能夠先生成Float或者Double對象調用equal方法,從前面Double的equal方法中能夠看出,實質上仍是調用了[float/double]To[Int/Long]Bit方法,建議直接使用該方法,避免沒必要要的開銷。

 參考:http://www.cnblogs.com/chenssy/p/3416195.html

相關文章
相關標籤/搜索