場景:本週在完成一個公司業務功能時,在判斷是否爲代叫單時調用了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方法有如下五個性質:
java中須要選用合適的方法比較
總的來講:類通常調用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