HOWTO · Java
Java 中的 string.equals() 與 == 之間的比較
本文介紹了 Java 中 string.equals 和==的區別。
本頁內容
在 Java 中,有兩種型別的物件比較。第一個是 == 運算子操作地址。它在內部比較物件的引用。另一方面,equals 方法比較例項的實際內容。
下面是演示運算子及其行為的程式碼塊。
public class Main {
public static void main(String[] args) {
String str1 = "name";
String str2 = "name";
String str3 = new String("name");
System.out.println(str1.equals(str2));
System.out.println(str1 == str2);
System.out.println(str1.equals(str3));
System.out.println(str3 == str1);
}
}
在上面的程式碼塊中,定義了三個字串例項。字串類本質上是不可變的。不變性意味著建立的例項永遠不會被覆蓋。
此外,變數將記憶體儲存在堆位置。因此,在生成字串 name 時,它會儲存在堆記憶體中。當另一個具有相同 name 值的新例項 str2 被初始化時,JVM 不會為其建立另一個新地址。相反,它將 str1 例項的引用分配給 str2 變數。
當我們嘗試將 str1==str2 與兩個字串例項進行比較時,事實證明了這一點。由於兩個引用都指向記憶體中的相同名稱地址,因此語句的結果為 true。下圖可以更好地理解所解釋的事實。
類似地,當 equals 方法應用於兩個例項時,它會產生布林值 true 值。由於函式作用於內容比較,所以是相等的。
接下來,使用 new 關鍵字初始化另一個字串 str3 變數。JVM 將在堆記憶體中為 name 地址內部建立一個新空間,而不是將例項分配給 str3 變數。因此,當進行內容比較時,它會在 equal 函式上返回 true。當使用 == 運算子比較地址時,它返回 false。
這是上面程式碼塊的輸出。
true
true
true
false