這篇文章源於同事問我說:
String str1 = "abc";
String str2 = "abc";
String str3 = new String("abc");
str1 == str2爲true,是不是表示str1和str2分配在棧上面的?他們沒有被new空間。
然後LZ自己YY了一下,想了個辦法用eclipse來查看變量的堆棧分配,權威性有待考證,如有不當,有勞賜教!
測試程序如下:
public class StackStringTest {
public static void main(String[] args) {
String str1 = "abc";
String str2 = "abc";
System.out.println(str1 == str2);
String str3 = new String("abc");
String str4 = new String("abc");
System.out.println(str3 == str4);
int a = 1;
Integer b = new Integer(1);
System.out.println(a);
System.out.println(b);
}
}
由此可以得到結論:
1.不管是String a ="a",還是String a = new String("a"),他們都是分配在對堆上面的(都有id,而int 類型的a沒有id)
2.之所以str1 == str2爲true,是因爲執行str2 = "abc"這條語句時,系統先檢測了存在value爲“abc”的這個地址空間(id=19),爲了節省空間,也就不再爲str2重新new一塊區域,而是直接指向str1所在堆區間,所以str1和str2的id相等。