首頁>Club>
9
回覆列表
  • 1 # XZJ88035001

    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的地址也不相同。

  • 中秋節和大豐收的關聯?
  • 2021年生豬管理條例?