深入理解equals和==的區別
今天在群裡面看到這個問題,equals和==的區別是什麼?我有點遲鈍,不就是如果是String型別的話equals比較的是內容,非字串型別則比較的是內容嗎?我想裡面的考點也沒有多少吧。
然後我就回復了一個:equals本來就是為了比較內容出現的啊。
這其實是一種沒有理解原理,死記硬背的體現。於是我很快被打臉了。
知恥而後勇,我立馬就去和度娘哭訴。
於是乎,我在網上果然又看到了那些“大佬”的解析,基本上無外乎是和我一樣,給出結論,來兩個demo。甚至乎,我還看到了一篇極易誤導小白的文章。說了一大堆,給的demo也是沒有代表性,最終還是得出equals比較字串的結論。
言歸正傳,來講一下我的理解:
首先我們來看底層程式碼,找到Object類的equals方法,我們可以看到:
public boolean equals(Object obj) {
return (this == obj);
}
好的這就是所有了,額,是不是發現equals方法本質和==並無區別,或者說,完全一樣。
但是為什麼在實際使用的時候,字串用equals又不一樣呢?
用排除法,我們顯然可以得出結論,一定是String類的問題。
所以讓我們來看看String類的程式碼,我們會發現它重寫了一個equals方法:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
我們會發現重寫的方法比較了String的char[]的每個元素是否相等,即所謂的內容是否相同。
到這裡我們的問題已經基本上解決。
但我不得不感嘆一句:手寫JDK的人真牛逼!
一天一個小知識,一年就變成傻逼
相關文章
- 深入探究Java中equals()和==的區別是什麼Java
- ==和equals方法的區別
- 【Java】equals 和 == 的區別Java
- java 中equals和==的區別Java
- 【ASP.net】Equals 和 == 的區別ASP.NET
- hashCode()和equals()的區別?(skycto JEEditor)
- Java中 equals() 方法和 == 的區別Java
- Java基礎- ==和equals和hashCode的區別Java
- 你真的知道 == 和 equals 的區別嗎?
- 你真的懂 == 和 equals 的區別嗎?
- 第四章 ==和equals()的區別
- javaSE中的==和equals的聯絡與區別Java
- JAVA中字串比較equals()和equalsIgnoreCase()的區別Java字串
- Java經典面試題: == 和 equals( )的區別Java面試題
- Java中(==)與equals的區別Java
- equals與==的區別(詳解)
- 使用javap深入理解Java整型常量和整型變數的區別Java變數
- 深入理解箭頭函式和傳統函式的區別函式
- Java常見知識點彙總(⑫)——==和equals的區別Java
- Java之String的equals與contentEquals區別Java
- Java面試題 equals()與"=="的區別?Java面試題
- 教你理解let和var的區別
- 【JavaScript】深入理解call,以及與apply、bind的區別JavaScriptAPP
- 深入瞭解gradle和maven的區別GradleMaven
- Java基礎-- ==號與equals()方法的區別Java
- Java技術分享:”==“和 equals 方法究竟有什麼區別?Java
- Java培訓教程:”==“和 equals 方法究竟有什麼區別?Java
- java基本型別和包裝型別的“==”和equals()方法Java型別
- 『Java 語法基礎』對 equals() 和 hashCode() 的理解Java
- 關於HashMap的key重寫hashcode和equals的理解HashMap
- 【轉】理解 CI 和 CD 之間的區別
- 深入理解 JavaScript 中的型別和型別判斷問題JavaScript型別
- 深入理解ES6之var,let,const區別
- 還傻傻分不清楚equals和==的區別嗎?看完就明白了
- 個人理解Vue和React區別VueReact
- Java中equals與==的本質區別是什麼?Java
- 深入理解CSS中em, rem, ex區別,及使用技巧CSSREM
- Flutter StatefulWidget和StatelessWidget的區別和使用以及更深入的思考Flutter