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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

java equal hashcode_Java(二)equal 和 hashcode使用

發布時間:2023/11/27 生活经验 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java equal hashcode_Java(二)equal 和 hashcode使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、hashCode()和equals()是什么?

hashCode()方法和equals()方法的作用其實一樣,在Java里都是用來對比兩個對象是否相等一致。

Equal

沒有重寫的equal 使用是繼承自 Object 的 equal 方法,和 “==” 的作用一樣, 比較兩個對象的內存地址是否相等。

public boolean equals(Object obj) {

return (this == obj);

}

重寫過的 equal, 比較的是兩個對象的屬性變量值 是否相等。

HashCode

hashCode是對象在內存地址通過hash算法得到的哈希碼。

二、hashCode()和equals()的區別

下邊從兩個角度介紹了他們的區別:一個是性能,一個是可靠性。他們之間的主要區別也基本體現在這里。

1、equals()既然已經能實現對比的功能了,為什么還要hashCode()呢?

因為重寫的equals()里一般比較的比較全面比較復雜,這樣效率就比較低,而利用hashCode()進行對比,則只要生成一個hash值進行比較就可以了,效率很高。

2、hashCode()既然效率這么高為什么還要equals()呢?

因為hashCode()并不是完全可靠,有時候不同的對象他們生成的hashcode也會一樣(生成hash值得公式可能存在的問題),所以hashCode()只能說是大部分時候可靠,并不是絕對可靠,所以我們可以得出(PS:以下兩條結論是重點,很多人面試的時候都說不出來):

equals()相等的兩個對象他們的hashCode()肯定相等,也就是用equals()對比是絕對可靠的。

hashCode()相等的兩個對象他們的equals()不一定相等,也就是hashCode()不是絕對可靠的。

三、hashCode()和equals()使用的注意事項

1、對于需要大量并且快速的對比的話如果都用equals()去做顯然效率太低,所以解決方式是,每當需要對比的時候,首先用hashCode()去對比,如果hashCode()不一樣,則表示這兩個對象肯定不相等(也就是不必再用equals()去再對比

了),如果hashCode()相同,此時再對比他們的equals(),如果equals()也相同,則表示這兩個對象是真的相同了,這樣既能大大提高了效率也保證了對比的絕對正確性!

2、這種大量的并且快速的對象對比一般使用的hash容器中,比如HashSet,HashMap,HashTable等等,比如HashSet里要求對象不能重復,則他內部必然要對添加進去的每個對象進行對比,而他的對比規則就是像上面說的那樣,先hashCode(),如果hashCode()相同,再用equals()驗證,如果hashCode()都不同,則肯定不同,這樣對比的效率就很高了。

3、然而hashCode()和equals()一樣都是基本類Object里的方法,而和equals()一樣,Object里hashCode()里面只是返回當前對象的地址,如果是這樣的話,那么我們相同的一個類,new兩個對象,由于他們在內存里的地址不同,則他們的

hashCode()不同,所以這顯然不是我們想要的,所以我們必須重寫我們類的hashCode()方法,即一個類,在hashCode()里面返回唯一的一個hash值,比如下面:

由于標識這個類的是他的內部的變量num和name,所以我們就根據他們返回一個hash值,作為這個類的唯一hash值。

所以如果我們的對象要想放進hashSet,并且發揮hashSet的特性(即不包含一樣的對象),則我們就要重寫我們類的hashCode()和equals()方法了。像String,Integer等這種類內部都已經重寫了這兩個方法。

當然如果我們只是平時想對比兩個對象 是否一致,則只重寫一個equals(),然后利用equals()去對比也行的

4、什么時候需要重寫?

一般的地方不需要重載hashCode,只有當類需要放在HashTable、HashMap、HashSet等等hash結構的集合時才會重載hashCode。

5、那么為什么要重載hashCode呢?

如果你重寫了equals,比如說是基于對象的內容實現的,而保留hashCode的實現不變,那么很可能某兩個對象明明是“相等”,而hashCode卻不一樣。

這樣,當你用其中的一個作為鍵保存到hashMap、hasoTable或hashSet中,再以“相等的”找另一個作為鍵值去查找他們的時候,則根本找不到。

6、為什么equals()相等,hashCode就一定要相等,而hashCode相等,卻不要求equals相等?

因為是按照hashCode來訪問小內存塊,所以hashCode必須相等。

HashMap獲取一個對象是比較key的hashCode相等和equals為true。

之所以hashCode相等,卻可以equal不等,就比如ObjectA和ObjectB他們都有屬性name,那么hashCode都以name計算,所以hashCode一樣,但是兩個對象屬于不同類型,所以equals為false。

7、為什么需要hashCode?

通過hashCode可以很快的查到小內存塊。

通過hashCode比較比equals方法快,當get時先比較hashCode,如果hashCode不同,直接返回false。

------------------------------------------

總結

以上是生活随笔為你收集整理的java equal hashcode_Java(二)equal 和 hashcode使用的全部內容,希望文章能夠幫你解決所遇到的問題。

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