關于==
對于基本類型和引用類型 == 的作用效果是不同的,如下所示:
基本類型:比較的是值是否相同;
引用類型:比較的是引用是否相同;
代碼示例:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLygTM1ATN0EjMwMTMwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
代碼解讀:因為 x 和 y 指向的是同一個引用,是以 == 也是 true,而 new String()方法則重寫開辟了記憶體空間,是以 == 結果為 false,而 equals 比較的一直是值,是以結果都為 true。
關于equals
equals 本質上就是 ==,隻不過 String 和 Integer 等重寫了 equals 方法,把它變成了值比較。看下面的代碼就明白了。
首先來看預設情況下 equals 比較一個有相同值的對象,代碼如下:
最後輸出結果為 false,equals源碼如下
原來 equals 本質上就是 。
那問題來了,兩個相同值的 String 對象,為什麼傳回的是 true?代碼如下:
當我們進入 String 的 equals 方法:
原來是 String 重寫了 Object 的 equals 方法,把引用比較改成了值比較。
總結 : 對于基本類型來說是值比較,對于引用類型來說是比較的是引用;而 equals 預設情況下是引用比較,隻是很多類重新了 equals 方法,比如 String、Integer 等把它變成了值比較,是以一般情況下 equals 比較的是值是否相等。
那麼兩個對象的 hashCode()相同,則 equals()也一定為 true,對嗎?
不對,兩個對象的 hashCode()相同,equals()不一定 true。
比如
執行的結果:
代碼解讀:很顯然“通話”和“重地”的 hashCode() 相同,然而 equals() 則為 false,因為在散清單中,hashCode()相等即兩個鍵值對的哈希值相等,然而哈希值相等,并不一定能得出鍵值對相等。
最後
我整理了一份Java系統學習資料,如有需要請掃描下方二維碼領取!