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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

java重写6,java重写equals()方法和hashCode()方法

發布時間:2023/12/15 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java重写6,java重写equals()方法和hashCode()方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.equals()方法和hashCode()方法是什么?

equals()和hashCode()都是是Java中萬物之源Object類中的方法;

equals方法用于比較兩個對象是否相同,Object類中equals方法的實現是比較引用地址來判斷的對象是否是同一個對象,通過覆蓋該方法可以實現自定義的判斷規則;

hashCode是jdk根據對象的地址或者字符串或者數字計算該對象的哈希碼值的方法。

2.為什么要重寫equals()方法?

Object類中equals方法比較的是兩個對象的引用地址,只有對象的引用地址指向同一個地址時,才認為這兩個地址是相等的,否則這兩個對象就不想等。

如果有兩個對象,他們的屬性是相同的,但是地址不同,這樣使用equals()比較得出的結果是不相等的,而我們需要的是這兩個對象相等,因此默認的equals()方法是不符合我們的要求的,這個時候我們就需要對equals()方法進行重寫以滿足我們的預期結果。

在java的集合框架中需要用到equals()方法進行查找對象,如果集合中存放的是自定義類型,并且沒有重寫equals()方法,則會調用Object父類中的equals()方法按照地址比較,往往會出現錯誤的結果,此時我們應該根據業務需求重寫equals()方法。

3.為什么要重寫hashCode()方法?

hashCode()方法用于散列數據的快速存儲,HashSet/HashMap/Hashtable類存儲數據時都是根據存儲對象的hashcode值來進行分類存儲的,一般先根據hashcode值在集合中進行分類,在根據equals()方法判斷對象是否相同。

HashMap對象是根據其Key的hashCode來獲取對應的Value。

生成一個好的hashCode值能提高HashSet查找的性能,差的hashCode值不但不能提高性能,甚至可能造成錯誤。比如hashCode方法中返回常量,會讓,HashSet的查找效率退化為List集合的查找效率;hashCode方法中返回隨機數,會讓查找結果變的不可預測。

好的hashCode生成方式是讓對象中的關鍵屬性與質數相乘,并將積相加獲取。

4.為什么java中在重寫equals()方法后必須對hashCode()方法進行重寫?

為了維護hashCode()方法的equals協定,該協定指出:如果根據 equals()方法,兩個對象是相等的,那么對這兩個對象中的每個對象調用 hashCode方法都必須生成相同的整數結果;而兩個hashCode()返回的結果相等,兩個對象的equals()方法不一定相等。

HashMap對象是根據其Key的hashCode來獲取對應的Value。

在重寫父類的equals()方法時,也重寫hashcode()方法,使相等的兩個對象獲取的HashCode值也相等,這樣當此對象做Map類中的Key時,兩個equals為true的對象其獲取的value都是同一個,比較符合實際。

5.重寫equals()方法:

重寫equals方法需要遵循Java如下規則,否則編碼行為會難以揣測:

自反性:對于任意的對象x,x.equals(x)返回true(自己一定等于自己);

對稱性:對于任意的對象x和y,若x.equals(y)為true,則y.equals(x)亦為true;

傳遞性:對于任意的對象x、y和z,若x.equals(y)為true且y.equals(z)也為true,則x.equals(z)亦為true;

一致性:對于任意的對象x和y,x.equals(y)的第一次調用為true,那么x.equals(y)的第二次、第三次、第n次調用也均為true,前提條件是沒有修改x也沒有修改y;

對于非空引用x,x.equals(null)永遠返回為false。

重寫代碼如下:

@Override

public boolean equals(Object o) {

//自反性

if (this == o) return true;

//任何對象不等于null,比較是否為同一類型

if (!(o instanceof Person)) return false;

//強制類型轉換

Person person = (Person) o;

//比較屬性值

return getId() == person.getId() &&

Objects.equals(getName(), person.getName()) &&

Objects.equals(getSex(), person.getSex());

}

6.重寫hashCode()方法:

HashMap對象是根據其Key的hashCode來獲取對應的Value。

在重寫父類的equals方法時,也重寫hashcode方法,使相等的兩個對象獲取的HashCode也相等,這樣當此對象做Map類中的Key時,兩個equals為true的對象其獲取的value都是同一個,比較符合實際。

重寫hashCode()方法需要遵循hashCode()協定:

一致性:在Java應用程序執行期間,在對同一對象多次調用hashCode方法時,必須一致地返回相同的整數,前提是將對象進行hashcode比較時所用的信息沒有被修改。

equals:如果根據equals()方法比較,兩個對象是相等的,那么對這兩個對象中的每個對象調用hashCode()方法都必須生成相同的整數結果,注:這里說的equals()方法是指Object類中未被子類重寫過的equals()方法。

附加:如果根據equals()方法比較,兩個對象不相等,那么對這兩個對象中的任一對象上調用hashCode方法不一定生成不同的整數結果。但是,程序員應該意識到,為不相等的對象生成不同整數結果可以提高哈希表的性能。

重寫代碼如下:

@Override

public int hashCode() {

return Objects.hash(getId(), getName(), getSex());

}

總結

以上是生活随笔為你收集整理的java重写6,java重写equals()方法和hashCode()方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。