標籤:
如果想尋找一個集合中是否包含有某個對象,大概的程式碼怎樣寫呢?當發現某個元素與要尋找的對對象進行equals方法比較的結果相等時,則停止繼續尋找並返回肯定的資訊,否則返回否定的資訊。如果是一個集合中有很多元素,譬如有一萬個元素,並且沒有包含要尋找的對象時,則意味著你的程式需要從該集合中取出一萬個元素進行啄一的比較才能得到結論,有人發明了一種hashCode演算法,來提高尋找的效率,這種方式將集合分成若干個儲存地區,每個對象可以計算出一個雜湊碼,可以將雜湊碼分組,每組分別對應某個儲存地區,根據一個對象的雜湊碼就可以確定該對象應該儲存在哪個地區,
hashSet就是採用雜湊演算法儲存物件的集合,它內部採用對某個數字n進行取餘的方式對雜湊碼進行分組的劃分對象的儲存地區。Object中的hashCode用來返回對就java對象的雜湊碼,從而提高尋找的效率。
為了保證一個類的執行個體對象能在HashSet正常儲存,要求這個類的兩個執行個體對象用equals()方法比較的結果相等時,它們的雜湊碼也必須相等,也就是說,如果obj1.equals(obj2)的結果為true,那麼一下運算式的結果頁要為true。
obj1.hashCode() == obj2.hashCode()
如果一個類的hashCode()方法沒有遵循上述要求,那麼,當這個的兩個執行個體對象用equals()方法比較的結果相等時,它們本來應該無法同時儲存進Set集合中,但是,如果將它們儲存進HashSet集合中時,由於它們的hashCode()方法的傳回值不同,第二個對象首先按雜湊碼計算可能會被放進與第一個對象不同的地區中,這樣,它就不可能與第一個對象進行equals方法比較了,也就可能被儲存進HashSet集合中了。Object類的hashCode()方法不能滿足對象被存入到HashSet中的要求,因為它的傳回值是通過對象的記憶體位址推算出來的,同一個對象在程式運行期間的任何時候返回的雜湊值都是始終不變的,所以,只要是兩個不同的執行個體對象,即使它們的equals方法比較結果相等,它們預設的hashCode方法的傳回值是不同的。
提示:
(1)通常來說,一個類的兩個執行個體對象用equals()方法比較的結果相等時,它們的雜湊碼也必須相等,但反之則不成立,即euqlas方法比較結果不相等的對象可以有相同的雜湊碼,或者說雜湊碼相同的兩個對象的equals方法比較的結果可以不等,例如,字串“BB”和"Aa"的euqals方法比較結果肯定不相等,但它們的hashCode方法傳回值卻相等。
(2)當一個對象被儲存進HashSet集合中以後,就不能修改這個對象中的那些參與計算雜湊值的欄位了,否則,對象修改後的雜湊值與最初儲存進HashSet集合中時的雜湊值就不同了,在這種情況下,即使在cantains方法使用該對象的當前引用作為的參數去HashSet集合中檢索對象,也將返回找不到對象的結果。這也會導致從HashSet集合中單獨刪除當前對象,從而造成記憶體泄露。
Set\HashSet集合為什麼能去重(轉)