1.String str1 = new String(“hello”);
1.New的物件都會放在堆裡面。
2.無論常量池內是否有“hello”字串,都會在堆內開闢新空間建立new物件。
3.在執行前會在常量池中檢視是否有一個"helllo"的物件,然後執行該行程式碼時new一個"hello"的物件存放在堆區中
4.若常量池中沒有該字串,就會在常量池中建立“hello”字串,若有,就不用。並且new的物件指向常量池,棧內再建立str1和str2分別指向堆中的new物件,str1和str2都是引用,存的是地址,而不是物件。
所以
System.out.println(str1==str2);//false
1
2. String str3 = “hello”;
java首先會在常量池裡面找是否有“hello”字串,若沒有,則在常量池內建立“hello”字串;若有,就不會再重新建立。再在棧內建立指向“hello”字串的引用,所以str3和str4其實指向的是同一個物件。
str1指向堆區的物件,str3指向常量池中的物件,兩個引用指向的地址不同,輸入false;
System.out.println(str1==str3);//false
System.out.println(str3==str4);//true
2
3.String str5 = “he”+“llo”;
編輯器會將其最佳化為“hello”,然後在常量池裡面找是否有字串“hello”,如存在,就將str5指向“hello”,所以str5與str3的地址是相同的。
4.String str8 = str6+str7;
String str6 = "he";
String str7 = "llo";
String str8 = str6+str7;
3
這段程式碼總共建立了5個物件,字串池中兩個、堆中三個
str8由兩個字串變數串聯。+運算子會在堆中建立來兩個String物件,這兩個物件的值分別是"he"和"llo",也就是說從字串池中複製這兩個值,然後在堆中建立兩個物件,然後再建立物件str8,然後將"hello"的堆地址賦給str3
5.String str9 = str6+“llo”;
由於在字串的"+"連線中,有字串引用存在,而引用的值str6在程式編譯期是無法確定的,即str6+"llo"無法被編譯器最佳化,只有在程式執行期來動態分配並將連線後的新地址賦給str9。
String str9 = str6+“llo”;
其實有點類似,str8=new StringBuffer(str6).append(str7).toString(),str9=new StringBuffer(str6).append(“34”).toString(),從上面可以看出str8和str9都開闢了新的記憶體空間來存放新的字串“hello”,因此和str3的地址不同,str8和str9的地址也不相同。
1.String str1 = new String(“hello”);
1.New的物件都會放在堆裡面。
2.無論常量池內是否有“hello”字串,都會在堆內開闢新空間建立new物件。
3.在執行前會在常量池中檢視是否有一個"helllo"的物件,然後執行該行程式碼時new一個"hello"的物件存放在堆區中
4.若常量池中沒有該字串,就會在常量池中建立“hello”字串,若有,就不用。並且new的物件指向常量池,棧內再建立str1和str2分別指向堆中的new物件,str1和str2都是引用,存的是地址,而不是物件。
所以
System.out.println(str1==str2);//false
1
1
2. String str3 = “hello”;
java首先會在常量池裡面找是否有“hello”字串,若沒有,則在常量池內建立“hello”字串;若有,就不會再重新建立。再在棧內建立指向“hello”字串的引用,所以str3和str4其實指向的是同一個物件。
str1指向堆區的物件,str3指向常量池中的物件,兩個引用指向的地址不同,輸入false;
System.out.println(str1==str3);//false
System.out.println(str3==str4);//true
1
2
1
2
3.String str5 = “he”+“llo”;
編輯器會將其最佳化為“hello”,然後在常量池裡面找是否有字串“hello”,如存在,就將str5指向“hello”,所以str5與str3的地址是相同的。
System.out.println(str3==str4);//true
1
1
4.String str8 = str6+str7;
String str6 = "he";
String str7 = "llo";
String str8 = str6+str7;
1
2
3
1
2
3
這段程式碼總共建立了5個物件,字串池中兩個、堆中三個
str8由兩個字串變數串聯。+運算子會在堆中建立來兩個String物件,這兩個物件的值分別是"he"和"llo",也就是說從字串池中複製這兩個值,然後在堆中建立兩個物件,然後再建立物件str8,然後將"hello"的堆地址賦給str3
5.String str9 = str6+“llo”;
由於在字串的"+"連線中,有字串引用存在,而引用的值str6在程式編譯期是無法確定的,即str6+"llo"無法被編譯器最佳化,只有在程式執行期來動態分配並將連線後的新地址賦給str9。
String str8 = str6+str7;
String str9 = str6+“llo”;
其實有點類似,str8=new StringBuffer(str6).append(str7).toString(),str9=new StringBuffer(str6).append(“34”).toString(),從上面可以看出str8和str9都開闢了新的記憶體空間來存放新的字串“hello”,因此和str3的地址不同,str8和str9的地址也不相同。