關於java 的常量池


 

常量:在編譯初期就確定的既爲常量

 

 

 java中的常量池技術,是爲了方便快捷地創建某些對象而出現的,當需要一個對象時,就可以從池中取一個出來(如果池中沒有則創建一個),則在需要重複創建相等變量時節省了很多時間。常量池其實也就是一個內存空間,不同於使用new關鍵字創建的對象所在的堆空間。

 

  String類也是java中用得多的類,同樣爲了創建String對象的方便,也實現了常量池的技術。

  測試代碼如下:

  public class Test{

  public static void main(String[] args){

  //s1,s2分別位於堆中不同空間

  String s1=new String("hello");

  String s2=new String("hello");

  System.out.println(s1==s2);//輸出false

  //s3,s4位於池中同一空間

  String s3="hello" String s4="hello";

  System.out.println(s3==s4);//輸出true

  }

  }

  用new String()創建的字符串不是常量,不能在編譯期就確定,所以new String()創建的字符串不放入常量池中,他們有自己的地址空間。

 

  String 對象(內存)的不變性機制會使修改String字符串時,產生大量的對象,因爲每次改變字符串,都會生成一個新的String。 java 爲了更有效的使用內存,常量池在編譯期遇見String 字符串時,它會檢查該池內是否已經存在相同的String 字符串,如果找到,就把新變量的引用指向現有的字符串對象,不創建任何新的String 常量對象,沒找到再創建新的。所以對一個字符串對象的任何修改,都會產生一個新的字符串對象,原來的依然存在,等待垃圾回收。

 

  代碼:

  String  a = “test”;

  String b = “test”;

  String b = b+"java";

  a,b同時指向常量池中的常量值"text",b=b+"java"之後,b原先指向一個常量,內容爲"test”,通過對b進行+"java" 操作後,b之前所指向的那個值沒有改變,但此時b不指向原來那個變量值了,而指向了另一個String變量,內容爲”text java“。原來那個變量還存在於內存之中,只是b這個變量不再指向它了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章