看到一個面試題說是String str1="abc"與String str2="abc"打印 str1==str2的結果,結果搞錯了下面說明下這個問題,先看下代碼
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2);
System.out.println("====================分割線=====================================");
String str3 = new String("abc");
String str4 = new String("abc");
System.out.println(str3==str4);
測試結果如下
解釋下原因,第一個true是因爲,String是final的,他存儲在方法區的常量區,看下圖
顯然“abc”在常量區只有一份,所以在多的引用,都是指向內存中同一個地址,所以結果是true
但如果是new 一個String對象呢,結果就會有所不同,此時在堆區會有一個對象被創建,如下圖
從圖中可以看出使用new 創建字符串時,會在堆區(heap)創建一個對象,它們都會引用常量區的一個字符串,所以,str3和str4不同。