關於hashcode的那些有趣的事情

2021-08-20 15:03:08 字數 1555 閱讀 5750

hashcode的作用是讓基於雜湊的集合正常的執行,這些雜湊的集合有:hashset、hashmap以及hashtable。

舉個例子:當我們需要新增乙個元素的時候a進set的時候,我們會計算出a的hashcode,然後求餘,得到這個雜湊值應該在哪個桶裡,最後在桶裡邊找有沒有雜湊值跟a這個元素的雜湊值相同的,沒有的話,最直接新增有的話,再用equals方法判斷,新增的值。

有趣的例子1:可變資料型別的操作改變,導致雜湊值的改變

listlist = new arraylist<>();

list.add("a");

set> set = new hashset<>();

set.add(list);//把list新增到set裡

system.out.println(set.contains(list));//true

list.add("b");//對list進行操作

list.add("c");

system.out.println(set.contains(list));//false,為什麼不是true

簡述:

??有趣的例子2重寫equals方法要重寫hashcode

比較有兩種方式行為比較和觀察比較,為了滿足我們需要的比較,我們改寫equals方法,下面是**

public static void main(string args)
public class student  

@override

public boolean equals(object s)

student ss = (student) s;

system.out.println("equals方法被呼叫啦");

return start.equals(ss.start) && stop.equals(ss.stop);

}}

但是結果卻是false,這是因為前邊說過,判斷是否包含,需要判斷hashcode是否相等,再使用equals,這裡我們雖然重寫了equals方法,但是由於是兩個new,他們的位址肯定不同(即hashcode不相同),執行可以得到驗證

所以還要再重寫hashcode,在student裡邊新增下面**

@override 

public int hashcode()

這裡還有乙個很有意思的驗證,驗證了set使用contains判斷是否包含的步驟是怎麼樣的,再次執行,列印出來的結果是:

hashcode方法被呼叫啦 hashcode: 19442

新增完畢

hashcode方法被呼叫啦 hashcode: 19442

equals方法被呼叫啦

true

說明每次new都回去檢視這個new的雜湊值,當處理contains的時候,就拿第二個new的值,去跟set所有的雜湊值比,如果相同的話,就繼續呼叫equals

那些年寫過的有趣注釋

加入如下樣式,可在ie 火狐下,字母和漢字都換行。防測試員,哦哈哈!width 400px word break break all overflow hidden white space normal class maccommentstyle 備註 檢視選中區域 區域是核心功能,所以應該 商類別...

關於重寫equals與hashCode

override public boolean equals object obj else if uname.equals user.uname return false if null else if equals user.return false if city null else if c...

關於hashCode和equals重寫

規則 只要重寫equals,就必須重寫hashcode。用set儲存物件或者用物件作為map的鍵時,必須重寫hashcode。也就是說,當需要用物件的雜湊值來判斷物件是否相等時必須重寫hashcode。說明 string重寫了hashcode和equals方法,所以我們可以非常愉快地使用string...