如何在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 = ↑
可以看到,val1和val2的是同一個值,因此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)空指針異常。