1、String a = "abc";
首先在棧中定義了一個引用變量a,檢查字符串常量池中是否已經存在"abc",如果存在直接將a指向這個地址,注意:指向的是字符串常量池中的地址;
如果字符串常量池中不存在"abc",則進行如下操作:1、在棧中創建三個char型的值'a','b','c',然后在堆中new一個String對象,它的值是剛才在棧中創建的三個char型值組成的數組{'a','b','c'},接着這個String對象會被存放進字符串常量池中,最后將a指向這個對象在字符串常量池中的地址。
String a = "abc";
等效於:
char data[] = {'a', 'b', 'c'}; String a = new String(data);
2、String a = new String("abc");
首先在棧中定義了一個引用變量a,然后在堆中new一個String對象,a指向這個對象,然后new出來的String對象再指向常量池中的abc。
3、比較
String a = "abc"; String b = "abc"; String c = new String("abc"); String d = new String("abc"); System.out.println(a == b); System.out.println(a == c); System.out.println(c == d);
執行結果:
true
false
false
注意:new String("abc") 無論字符串常量池中是否存在“abc”,都會在堆中生成一個新的對象,所以a、c、d三者不相等。
以上為個人理解,如果有誤,歡迎指正。