1. 程式人生 > 其它 >談談自己對於hashcode和equals的理解

談談自己對於hashcode和equals的理解

技術標籤:知識點總結從頭開始學javajava

一直以來,對於hashcode都只停留在知道的層面。只知道機械性的背誦:
可能hashcode相同但是equals不相同,不過equals相同hashcode一定相同。
重寫equals一定重寫hashcode。
今天再去學習的時候,突然有了自己新的理解,在這裡記錄一下。
首先,hash是一種演算法,而hashcode就是通過這種演算法算出的值,有一個對應的表叫做hash表。
舉個例子,就是有懂大樓叫做hash表,每個物件就是不同的住戶,而hashcode就是大樓的樓層,也就是對應的hash表中的值。
當有一個物件要進行儲存,也就是有新住戶要入住,首先通過hash演算法計算出他要入住哪層樓,也就是算出他的hashcode,然後去看那一層樓裡他是不是已經入住過了,也就是比較值是否相同,如果沒有相同的,那他就順利入住了。

然後回到上面的那兩句話,首先是第一句。有了上面的例子就很好理解了。hashcode一樣只能徵明你們住在同一層,不能徵明你們就是同一個人。但是equals代表你們是同一個人,那麼你們肯定住在同一樓裡面。
至於重寫也很好理解,就是說你搬家了,不管是不是還在同一棟樓裡,物業都會對你的住址進行重新登記。

寫到這裡我想起了一個很有趣的例子。
程式碼是這樣的:

String a = "name";
String b = "name";
System.out.println(a.equals(b));
System.out.println(a==b);
System.
out.println(a.hashCode()); System.out.println(b.hashCode());

執行結果如下:
在這裡插入圖片描述
將程式碼稍微修改一下:

String c = new String("111");
String d = new String("111");
System.out.println(c==d);
System.out.println(c.equals(d));
System.out.println(c.hashCode());
System.out.println(d.hashCode());

執行結果如下:
在這裡插入圖片描述
從中很明顯的可以看到,當兩個物件的equals是為true的時候,他們的hashcode一定是一樣的,不管是用何種方式建立的。唯一的區別在兩個物件的比較上。

第一種之所以為true,是因為"name"是一個字串,他被直接在常量池中建立,當建立b這個物件的時候,因為常量池中已經有"name"了,所以就不再建立,直接引用了,所以a和b都是引用的常量池中的"name",所以是true。
但是第二種情況就不一樣了,c和d都是通過new String()建立的物件,他們是兩個值一樣的物件,所以為false