談談自己對於hashcode和equals的理解
阿新 • • 發佈:2021-02-01
一直以來,對於hashcode都只停留在知道的層面。只知道機械性的背誦:
可能hashcode相同但是equals不相同,不過equals相同hashcode一定相同。
重寫equals一定重寫hashcode。
今天再去學習的時候,突然有了自己新的理解,在這裡記錄一下。
首先,hash是一種演算法,而hashcode就是通過這種演算法算出的值,有一個對應的表叫做hash表。
舉個例子,就是有懂大樓叫做hash表,每個物件就是不同的住戶,而hashcode就是大樓的樓層,也就是對應的hash表中的值。
當有一個物件要進行儲存,也就是有新住戶要入住,首先通過hash演算法計算出他要入住哪層樓,也就是算出他的hashcode,然後去看那一層樓裡他是不是已經入住過了,也就是比較值是否相同,如果沒有相同的,那他就順利入住了。
至於重寫也很好理解,就是說你搬家了,不管是不是還在同一棟樓裡,物業都會對你的住址進行重新登記。
寫到這裡我想起了一個很有趣的例子。
程式碼是這樣的:
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一定是一樣的,不管是用何種方式建立的。唯一的區別在兩個物件的比較上。
但是第二種情況就不一樣了,c和d都是通過new String()建立的物件,他們是兩個值一樣的物件,所以為false