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 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