深入理解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的==和equalsJava
- 深入探究Java中equals()和==的區別是什麼Java
- 【Java】equals 和 == 的區別Java
- ==和equals方法的區別
- java 中equals和==的區別Java
- equals()和hashCode()的區別
- Java中equals和==的區別Java
- equals和equalsIgnoreCase的區別
- Java中 equals() 方法和 == 的區別Java
- 【ASP.net】Equals 和 == 的區別ASP.NET
- 在java中“equals”和“==”的區別Java
- "a".equals(b)和b.equals("a")有什麼區別
- 你真的知道 == 和 equals 的區別嗎?
- 你真的懂 == 和 equals 的區別嗎?
- Java中HashMap和TreeMap的區別深入理解JavaHashMap
- Java基礎- ==和equals和hashCode的區別Java
- hashCode()和equals()的區別?(skycto JEEditor)
- 第四章 ==和equals()的區別
- Java經典面試題: == 和 equals( )的區別Java面試題
- javaSE中的==和equals的聯絡與區別Java
- C# 中的 == 和 equals()有什麼區別?C#
- Object類和String類equals方法的區別Object
- Java中(==)與equals的區別Java
- equals與==的區別(詳解)
- JAVA中字串比較equals()和equalsIgnoreCase()的區別Java字串
- Java面試題 equals()與"=="的區別?Java面試題
- 使用javap深入理解Java整型常量和整型變數的區別Java變數
- 深入理解箭頭函式和傳統函式的區別函式
- Java常見知識點彙總(⑫)——==和equals的區別Java
- 程式設計師必須搞清的概念equals和=和hashcode的區別程式設計師
- 教你理解let和var的區別
- Java基礎-- ==號與equals()方法的區別Java
- Java培訓教程:”==“和 equals 方法究竟有什麼區別?Java
- Java技術分享:”==“和 equals 方法究竟有什麼區別?Java
- 【JavaScript】深入理解call,以及與apply、bind的區別JavaScriptAPP
- 個人理解Vue和React區別VueReact
- java基本型別和包裝型別的“==”和equals()方法Java型別
- Java之String的equals與contentEquals區別Java