天天看點

Java常見面試題— equals 和 == 的差別是什麼?

關于==

對于基本類型和引用類型 == 的作用效果是不同的,如下所示:

基本類型:比較的是值是否相同;

引用類型:比較的是引用是否相同;

代碼示例:

Java常見面試題— equals 和 == 的差別是什麼?

代碼解讀:因為 x 和 y 指向的是同一個引用,是以 == 也是 true,而 new String()方法則重寫開辟了記憶體空間,是以 == 結果為 false,而 equals 比較的一直是值,是以結果都為 true。

關于equals

equals 本質上就是 ==,隻不過 String 和 Integer 等重寫了 equals 方法,把它變成了值比較。看下面的代碼就明白了。

首先來看預設情況下 equals 比較一個有相同值的對象,代碼如下:

Java常見面試題— equals 和 == 的差別是什麼?

最後輸出結果為 false,equals源碼如下

Java常見面試題— equals 和 == 的差別是什麼?

原來 equals 本質上就是 。

那問題來了,兩個相同值的 String 對象,為什麼傳回的是 true?代碼如下:

Java常見面試題— equals 和 == 的差別是什麼?

當我們進入 String 的 equals 方法:

Java常見面試題— equals 和 == 的差別是什麼?

原來是 String 重寫了 Object 的 equals 方法,把引用比較改成了值比較。

總結 : 對于基本類型來說是值比較,對于引用類型來說是比較的是引用;而 equals 預設情況下是引用比較,隻是很多類重新了 equals 方法,比如 String、Integer 等把它變成了值比較,是以一般情況下 equals 比較的是值是否相等。

那麼兩個對象的 hashCode()相同,則 equals()也一定為 true,對嗎?

不對,兩個對象的 hashCode()相同,equals()不一定 true。

比如

Java常見面試題— equals 和 == 的差別是什麼?

執行的結果:

Java常見面試題— equals 和 == 的差別是什麼?

代碼解讀:很顯然“通話”和“重地”的 hashCode() 相同,然而 equals() 則為 false,因為在散清單中,hashCode()相等即兩個鍵值對的哈希值相等,然而哈希值相等,并不一定能得出鍵值對相等。

最後

我整理了一份Java系統學習資料,如有需要請掃描下方二維碼領取!

Java常見面試題— equals 和 == 的差別是什麼?