1. 程式人生 > >String a = "abc";和String b = new String("abc")建立物件

String a = "abc";和String b = new String("abc")建立物件

  1. String a = "abc";

首先會在棧中建立一個對String類物件的引用變數a,然後去查詢字串常量池中是否有"abc"。如果有,會把a指向這個物件的地址。如果字串常量池中沒有"abc",則在棧中建立三個char型的值'a','b','c',然後在堆中建立一個String物件object,它的值是剛才在棧中建立的三個char型值組成的陣列{'a','b','c'},接著這個String物件object會被存放進字串常量池中,最後將a指向這個物件的的地址。

   2. String b = new String("abc"); 可以分為兩步,String object = "abc"; 和 String b = new String(object); 第一步參照上面,第二步由於"abc"已經被建立並儲存在字串常量池中,因此jvm只會在堆中建立一個String物件,它的值共享棧中已有的三個char型值。 第一種方式JVM會根據String pool中的具體情況來決定是否建立新的物件。 第二種方式一概在堆中建立新的物件,而不管字串常量池中是否已有這個的字串。  

3.一些建立物件的問題

  • String s = "a" +"b" + "c" + "d";這條語句建立了幾個物件? 建立了一個物件,因為相對於字串常量相加的表示式,編譯器會在編譯期間進行優化,直接將其編譯成常量相加的結果。
  • String s; 沒有建立物件。
  • String a = "abc"; String b = "abc"; 建立了一個物件,只是在第一條語句中建立了一個物件,a和b都指向相同的物件"abc",引用不是物件。