微信搜索??「碼農田小齊」,關注這個在紐約的程式媛,回復「01-05」可以獲取計算機精選書籍、個人刷題筆記、大廠面經、面試資料等資源,么么噠~
首先我們有一個假設:任何兩個 object 的 hashCode 都是不同的,
那么在這個條件下,有兩個 object 是相等的,那如果不重寫 hashCode(),算出來的哈希值都不一樣,就會去到不同的 buckets 了,就迷失在茫茫人海中了,再也無法相認,就和 equals() 條件矛盾了,證畢,
撒花~~??????
接下來我們再對這兩個方法一探究竟:
其實 hashCode() 和 equals() 方法都是在 Object class 這個老祖宗里定義的,Object 是所有 Java 中的 class 的鼻祖,默認都是有的,甩不掉的,
那既然是白給的,我們先來看看大禮包里有什么,谷歌 Object 的 Oracle 檔案:

所以這些方法都是可以直接拿來用的呢~
回到 hashCode() 和 equals(),那么如果這個新的 class 里沒有重寫 (override) 這兩個方法,就是默認繼承 Object class 里的定義了,
那我們點進去來看看 equals() 是怎么定義的:

記筆記:
equals() 方法就是比較這兩個 references 是否指向了同一個 object.
嗯???你在逗我嗎??那豈不是和 == 一樣了??
補充:
我們常用的比較大小的符號之==
如果是 primitive type,那么 == 就是比較數值的大小;
如果是 reference type,那么就比較的是這兩個 reference 是否指向了同一個 object,
再補充:
Java 的資料型別可以分為兩種:
Primitive type 有且僅有8種:byte, short, int, long, float, double, char, boolean.
其他都是 Reference type.
所以雖然 Java 聲稱 “Everything is object”,但是還是有非 object 資料型別的存在的,
我不信,我要去原始碼里看看它是怎么實作的,

?
哈,還真是的,繞了這么半天,equals() 就是用 == 來實作的!
那為什么還弄出來這么個方法呢?
答:為了讓你 override~
比如一般來說我們比較字串就是想比較這兩個字串的內容的,那么:
str1 = “tianxiaoqi”;
str2 = new String(“tianxiaoqi”);
str1 == str2; // return false
str1.equals(str2); // return true
因為 String 里是重寫了 equals() 方法的:

老祖宗留給你就是讓你自己用的,如果你不用,那人家也提供了默認的方法,也是夠意思了,
好了,我們再去看 hashCode() 的介紹:

那至于 hashCode() 回傳的究竟是什么,和本文關聯不太大,有興趣的同學可以看參考這篇文章[1],結論就是:
回傳的并不一定是物件的(虛擬)記憶體地址,具體取決于運行時庫和JVM的具體實作,
但無論是怎么實作的,都需要遵循檔案上的約定,也就是對不同的 object 會回傳唯一的哈希值,
所以說,
hashCode() 決定了 key 放在這個桶里的編號,也就是在陣列里的 index;
equals() 是用來比較兩個 object 是否相同的,
如果你喜歡這篇文章,記得給我點贊留言哦~你們的支持和認可,就是我創作的最大動力,我們下篇文章見!
我是小齊,紐約程式媛,終生學習者,每天晚上 9 點,云自習室里不見不散!
更多干貨文章見我的 Github: https://github.com/xiaoqi6666/NYCSDE
參考資料
hashCode()參考文章: https://blog.csdn.net/xusiwei1236/article/details/45152201
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/210525.html
標籤:其他
