Java 中的 string.equals() 與 == 之間的比較

Rashmi Patidar 2021年10月2日
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
Rashmi Patidar avatar Rashmi Patidar avatar

Rashmi is a professional Software Developer with hands on over varied tech stack. She has been working on Java, Springboot, Microservices, Typescript, MySQL, Graphql and more. She loves to spread knowledge via her writings. She is keen taking up new things and adopt in her career.

LinkedIn

相關文章 - Java String