Java中"=="和equals方法在字符串比較中的不同

昨天寫代碼的時候,遇到了比較兩個字符串的值是否相同的情況,然後發現使用"=="和equals會得到不同的結果。其實我的目的是比較兩個字符串的序列是否相同,這個時候應該使用equals方法的。大家在比較兩個字符串的時候一定要想明白自己到底是要比較這兩個字符串的什麼,是序列還是引用?現在把自己總結的內容寫下來。

首先介紹什麼是字符串池:Java中有一個字符串池,其實是很多字符串的一個集合。字符串池由字符串直接量(注意:像”trttr” + “gergre”這樣的形式也算不上字符串直接量,必須是String s="12345",這樣的形式),有限個字符串直接量進行+運算得到的結果,類java.lang.String的成員方法intern創建的字符串實例對象這3個部分組成。無論字符串池中的字符串是由其中哪個方法形成的,在比較的時候是沒有區別的,你可以把他們看成都是字符串直接量。比如:"123456", "123"+"456", "123456".intern(), 這3者在池中是一樣的。

運算符“==”,用來判斷其兩側的兩個引用值是否相等,即是否指向相同的實例對象。所以當通過==返回true時,有這樣兩種可能:1,兩個字符串引用都指向字符串池中的同一個字符串值,2.兩個引用都指向字符串池外的同一個實例對象,比如

<span style="white-space:pre">		</span>//此時a==b返回true
<span style="white-space:pre">		</span>String a = new String("123");
<span style="white-space:pre">		</span>String b = a;

String中的equals方法判斷兩個字符串引用指向的字符串的序列是否相等,無論這兩個字符串引用都是指向字符串池或者字符串池外還是一個指向字符串池一個指向池外,所以對於比較兩個字符串的序列是否相等一般都用eauals(在實際情況中我們一般都是用到這個)。

總結一下就是:比較字符串序列是否相等用equals, 比較字符串是否指向同一個實例對象用==。

以下是我列出的各種字符串引用可能指向的值,你可以通過對他們使用equalis和==來進行理解。

String a = new String("123");
String b = a;
String c = a.intern();
String d = "12" + "3";
String f = "123".intern();
String h = "123";


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章