日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java中的祖先类_Java程序公共祖先类-Object

發(fā)布時(shí)間:2025/3/15 java 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java中的祖先类_Java程序公共祖先类-Object 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在Java中,所有的類都繼承自O(shè)bject類,它是所有的始祖,但是我們不需要顯示的書寫extends Object.

equals方法

在JDK中,Object類的equals方法的實(shí)現(xiàn)如下:

public boolean equals(Object obj) {

return (this == obj);

}

就是簡單的比較兩個(gè)是否是引用的同一個(gè)對象即可。然而在工程中我們需要重新實(shí)現(xiàn)equals方法。

Java語言規(guī)范中要求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,在引用沒有變化情況下,反復(fù)調(diào)用也為true;

對于任意的非空引用x,調(diào)用x.equals(null)都返回false;

但是在繼承層次中的兩個(gè)對象判斷是否相等卻比較麻煩,因?yàn)樯婕暗筋愋偷霓D(zhuǎn)換。

如何才能編寫完美的equals方法呢:

顯式參數(shù)命名為 otherObject, 稍后需要將它強(qiáng)制轉(zhuǎn)換成另一個(gè)叫做 other 的變量。

檢測 this 與 otherObject 是否引用同一個(gè)對象:

if(this == otherObject) return true;

檢測 otherObject 是否為 null , 如 果 為 null , 返 回 false。 這項(xiàng)檢測是很必要的。

if(otherObject == null) return false;

比較 this 與 otherObject 是否屬于同一個(gè)類。如果 equals 的語義在每個(gè)子類中有所改變, 就使用 getClass 檢測:

if(getClass() != otherObject.getClass()) return false;

如果所有的子類都擁有統(tǒng)一的語義, 就使用 instanceof 檢測:

if(!(otherObject instanceof ClassName)) return false;

轉(zhuǎn)換為對應(yīng)的類型變量:

ClassName other = (ClassName) otherObject;

開始比較對象中的每個(gè)屬性,基本數(shù)據(jù)類型使用"=="判斷,引用數(shù)據(jù)類型使用equals方法判斷。

hashCode方法

散列碼(hashCode)是由對象導(dǎo)出的一個(gè)整數(shù)值,hashCode是沒有規(guī)律的。hashCode定義在Object類中,因此每個(gè)對象都有自己的hashCode,其值為對象的存儲(chǔ)地址:

public native int hashCode();

如果在程序中重新定義了equals方法,那么就需要同時(shí)定義hashCode方法;方便用戶將對象插入到Hash表中。

如何重新定義hashCode方法

hashCode方法應(yīng)該返回一個(gè)整型數(shù)值(可以是負(fù)數(shù)),合理地利用各個(gè)屬性的hashCode,以便讓該對象產(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);

}

直接針對各個(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。