如何在JAVA中比較字符串(string)?

如何在JAVA中比較字符串(string)?

我們有兩個字符串a(chǎn)和b,如何比較它們呢?用==還是.equals()?

==.equals()有什么區(qū)別

==比較的左右兩側(cè)的值。當(dāng)左右兩側(cè)為基本類型的時候,直接比較值,當(dāng)左右兩側(cè)為引用類型的時候,比較的是引用本身的值。字符串變量為引用類型,因此==比較的是字符串引用本身的值。
.equals()一般是java類中聲明的比較方法,比較自己和另一個實例是否為同一個值。string類型已經(jīng)實現(xiàn)了.equals()方法,會比較自身和另一個字符串是否相等。

為什么有時候==在相同字符串的時候會返回true

查看下列代碼:

String val1 = "val";
String val2 = "val";
// 輸出為 true
System.out.println(val2 == val1);

因為字符串在java中非常常用,出于性能和復(fù)用的考慮,代碼中直接聲明的字符串會直接在字符串常量池中初始化,而且只初始化一次,后續(xù)使用都會引用這個常量。

val1 = 字符串常量池引用 ===> 字符串本體(位于常量池中)
val2 = ↑

可以看到,val1val2的是同一個值,因此val1 == val2會返回true。

但是,當(dāng)代碼變成下面這樣的時候:

String val1 = "val";
String val2 = new String("val");
// 輸出為 false
System.out.println(val2 == val1);

上面的val2會在堆中新建一個對象,而不是常量池的對象,如下所示:

val1 = 字符串常量池引用 => 字符串本體(位于常量池中)
val2 = 字符串堆中對象引用 => 字符串本體(位于堆中)

因此兩個引用的值并不相等。

如何正確使用.equals()

在上面的第二個例子中,很明顯兩個字符串是一樣的,但是直接用==會得出false的結(jié)果,這時候就要使用equals了。
但是,.equals()使用也有要注意的地方:
當(dāng)一個字符串常量和一個字符串變量比較時,要保持常量在前面。比如"張三".equals(name),而不是name.equals("張三")。這樣可以保證在name
為null時,仍然可以獲得比較的結(jié)果,如果反著寫,就會得到一個空指針異常了。
當(dāng)兩個變量比較時,最好使用Objects.equals,比如比較兩個名字是否一樣,可以寫成Objects.equals(name1,name2)。Objects.equals會在內(nèi)部調(diào)用對象的equals,并且會提前判斷變量是否為空,防止出現(xiàn)空指針異常。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容