在基本運算符中, == 扮演一個重要的角色,
而跟它相似的還有個 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中進行比較的話,
如果是基本類型,用 == 就可以。
但是如果是複合類型,像 String 這種,
甚至於自定義類,
如果想要比較的話,單純用 == 是不行的,必須重載 equals來實現比較的邏輯。
說到這裡,
順便說一個有趣的東西,
這裡的結果是 false。
那麼為什麼呢?需要知道更多細節的碼友們請點擊此鏈接
閱讀更多 Java高併發框架 的文章