05.16 Java編程思想——你所不知道的 equals()

在基本運算符中, == 扮演一個重要的角色,

而跟它相似的還有個 equals()方法,

這兩個的區別是什麼你知道麼。

來看個例子

來看下面這段代碼

String a = "abc"String b = "abc";String c = new String(“abc”);

下面用兩種方法來比較,

boolean resultA = a == b;booolean resultB = a.equals(b);boolean resultC = a == c;

這裡的結果是,

resultA == true;

resultB == true;

resultC == false;

比較容易產生疑惑的地方是 a 跟 c用 == 來比較的時候,為什麼會是 false?

如果換成 eqauls的話,

boolean resultD = a.equals(c);

resultD則是 true的。

下面分析下原因。

== 和 eqauls的實質

其實,== 對比的是內存地址,

而 equals()在沒有重寫的情況下,對於複合類型來說,也是對比的內存地址,

如果對於複合類型,可以重寫 eqauls方法來定義匹配的規則。

以這個原則,回到上面的例子中。

String a = "abc"String b = "abc";

當我們定義了一個 a之後,其實會在內存裡開闢一塊地方用來存放字符串,

第二次再實例化一個 String對象時,如果緩存池中已經有字符串了,則直接讓新對象引用原有的內存地址。

所以如果用 == 來比較的話,

因為 String不是基本類型,所以直接比較兩個的內存地址的情況下是 true 的。

而為什麼 resultC 是 false呢?

因為當我們用 new String("abc") 來實例化新的對象的時候,

即使內存池已經有 "abc" 了,因為 new 操作符的存在,

還是會開闢一個內存地址來存放新的對象,

所以用 == 來比較 a 跟 c 的話,

結果是 false的。

equals() 是什麼情況呢

equals()是 Object的一個方法,

像 String這種非基本類型是可以重載 equals()來定義自己的匹配邏輯的。

所以可以在上面的例子看到,

雖然 c 引用了跟 a 不一樣的內存地址,

但是在用 eqauls來比較的情況下,

因為兩者的內容相同,所以結果是 true的。

下面貼下 String的 equals方法就明白了

Java編程思想——你所不知道的 equals()

總結

在Java中進行比較的話,

如果是基本類型,用 == 就可以。

但是如果是複合類型,像 String 這種,

甚至於自定義類,

如果想要比較的話,單純用 == 是不行的,必須重載 equals來實現比較的邏輯。

說到這裡,

順便說一個有趣的東西,

Java編程思想——你所不知道的 equals()

這裡的結果是 false。

那麼為什麼呢?需要知道更多細節的碼友們請點擊此鏈接

Java編程思想——你所不知道的 equals()


分享到:


相關文章: