Java中如何判斷兩個(gè)字符串相等

如何判斷兩個(gè)字符串相等

Java 中可以有兩種方法來(lái)做這個(gè)事,== 運(yùn)算符 與 equals 方法。但是這兩者又有什么區(qū)別?

先來(lái)看一段示例代碼:

String a1 = "abc";
String b1 = "abc";

// 使用 == 判斷相等時(shí),指相同的內(nèi)存地址,也就是同一個(gè)對(duì)象實(shí)例。
System.out.println(a1 == b1); // true

String a2 = new String("abc");
String b2 = new String("abc");

System.out.println(a2 == b2); // false 因?yàn)?a 和 b 指向不同對(duì)象。

// equals 方法判斷的相等在不同的對(duì)象中實(shí)現(xiàn)不同,意義也不同。
System.out.println(a2.equals(b2)); // true

String a3 = a1 + "d";
String b3 = a1.concat("d");
System.out.println(a3 == b3);

Java 中所有的對(duì)象都繼承自 Object 類,在 Object 類中實(shí)現(xiàn)的 equals() 方法如下:

public boolean equals(Object obj) {  
    return (this == obj);  
}
  • String 類重寫了這個(gè)方法,重寫后的方法首先判斷內(nèi)存地址是否一致,如果一致返回 true,否則比較字符串的內(nèi)容是否一致,如果內(nèi)容一致也返回 true。因此,使用 String 類的 equals 方法是比較內(nèi)容是否一致,而使用“==”是比較實(shí)例是否是同一個(gè)實(shí)例。
  • StringBuilder 類并沒有重寫 equals 方法,因此使用 equals 比較時(shí),需要時(shí)同一個(gè)實(shí)例才會(huì)返回 true,否則返回 false。

Java創(chuàng)建字符串的過(guò)程

使用“=”賦值時(shí),如果內(nèi)存中已經(jīng)有這個(gè)字符串,就會(huì)直接將其地址給這個(gè)變量,不會(huì)產(chǎn)生新的字符串。

如上面代碼中的“a1”與“b1”, 二者指向同一個(gè)實(shí)例。

使用“+”或者“concat”方法拼接字符串的時(shí)候,會(huì)創(chuàng)建一個(gè)新的字符串,占用新的內(nèi)存空間,因此使用“==”判斷時(shí)返回false。

Java 中 String 的引用方式

String a1 = "abc";
String b1 = "abc";
System.out.println(a1 == b1); // true

先在內(nèi)存中創(chuàng)建字符串“abc”, 然后將地址的引用給了變量 a1, 隨后又把這個(gè)地址的引用給了 b1。因此 a1 和 b1 引用的是同一段內(nèi)存。
由于 String 類是一個(gè)不可更改的類。字符串不可被更改,所以這樣的方式并不會(huì)產(chǎn)生問(wèn)題。

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

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

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