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