java中的祖先类_Java程序公共祖先类-Object
在Java中,所有的類都繼承自Object類,它是所有的始祖,但是我們不需要顯示的書寫extends Object.
equals方法
在JDK中,Object類的equals方法的實現如下:
public boolean equals(Object obj) {
return (this == obj);
}
就是簡單的比較兩個是否是引用的同一個對象即可。然而在工程中我們需要重新實現equals方法。
Java語言規范中要求equals方法需要符合以下要求:
自反性:對于任何的非空引用x,都有x.equals(x)返回true;
對稱性:如果x.equals(y) == true, 那么y.equals(x) == true;
傳遞性:如果x.equals(y) == true, y.equals(z) == true,那么x.equals(z) == true;
一致性:如果x,y開始比較為true,在引用沒有變化情況下,反復調用也為true;
對于任意的非空引用x,調用x.equals(null)都返回false;
但是在繼承層次中的兩個對象判斷是否相等卻比較麻煩,因為涉及到類型的轉換。
如何才能編寫完美的equals方法呢:
顯式參數命名為 otherObject, 稍后需要將它強制轉換成另一個叫做 other 的變量。
檢測 this 與 otherObject 是否引用同一個對象:
if(this == otherObject) return true;
檢測 otherObject 是否為 null , 如 果 為 null , 返 回 false。 這項檢測是很必要的。
if(otherObject == null) return false;
比較 this 與 otherObject 是否屬于同一個類。如果 equals 的語義在每個子類中有所改變, 就使用 getClass 檢測:
if(getClass() != otherObject.getClass()) return false;
如果所有的子類都擁有統一的語義, 就使用 instanceof 檢測:
if(!(otherObject instanceof ClassName)) return false;
轉換為對應的類型變量:
ClassName other = (ClassName) otherObject;
開始比較對象中的每個屬性,基本數據類型使用"=="判斷,引用數據類型使用equals方法判斷。
hashCode方法
散列碼(hashCode)是由對象導出的一個整數值,hashCode是沒有規律的。hashCode定義在Object類中,因此每個對象都有自己的hashCode,其值為對象的存儲地址:
public native int hashCode();
如果在程序中重新定義了equals方法,那么就需要同時定義hashCode方法;方便用戶將對象插入到Hash表中。
如何重新定義hashCode方法
hashCode方法應該返回一個整型數值(可以是負數),合理地利用各個屬性的hashCode,以便讓該對象產生的hashCode更加均勻。
@Override
public int hashCode() {
return name.hashCode() +
new Double(salary).hashCode() +
hreDate.hashCode();
}
更好的是可以避免null安全的方法Objects.hashCode方法,并使用各個屬性:
@Override
public int hashCode() {
return Objects.hashCode(name)
+new Double(salary).hashCode() +
Objects.hashCode(hreDate);
}
直接針對各個屬性值調用Objects.hash方法:
@Override
public int hashCode() {
return Objects.hash(name, salary, hreDate);
}
如果存在數組類型的屬性,那么可以使用靜態的Arrays,hashCode方法計算散列值,該散列值由數組的各個元素組成。
hashCode與equals方法的一致性
equals與hashCode的定義必須一致,如果x.equals(y) 返回true,那么x.hashCode與y.hashCode必須返回相同的值。
比如在Employee類中,equals方法比較的是ID,那么hashCode散列的時候也應該使用ID,而不是name或者salary。
總結
以上是生活随笔為你收集整理的java中的祖先类_Java程序公共祖先类-Object的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux同步数据库,Linux两台服务
- 下一篇: smote算法_支持向量机算法的可解释和