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