常量池

String 中一個方法:intern  java

      String的intern()方法就是擴充常量池的一個 方法;當一個String實例str調用intern()方法時,Java查找常量池中是否有相同Unicode的字符串常量,若是有,則返回其的引用, 若是沒有,則在常量池中增長一個Unicode等於str的字符串並返回它的引用;數組

關於String是不可變的code

     這一說又要說不少,你們只要知道String的實例一旦生成就不會再改變了,好比說:          String  tr=」kv」+」ill」+」 「+」ans」; 
就是有4個字符串常量,首先」kv」和」ill」生成了」kvill」存在內存中,而後」kvill」又和」 「 生成 」kvill 「存在內存中,最後又和生成了」kvill ans」;並把這個字符串的地址賦給了str,就是由於String的「不可變」產生了不少臨時變量,這也就是爲何建議用StringBuffer的原 因了,由於StringBuffer是可改變的.htm

常量池中對象和堆中的對象對象

public class Test{

Integer i1=new Integer(1);
   Integer i2=new Integer(1);
//i1,i2分別位於堆中不一樣的內存空間

   System.out.println(i1==i2);//輸出false


   Integer i3=1;
   Integer i4=1;
//i3,i4指向常量池中同一個內存空間

   System.out.println(i3==i4);//輸出true

//很顯然,i1,i3位於不一樣的內存空間

System.out.println(i1==i3);//輸出false
}

Java是一種動態連接的語言,常量池的做用很是重要,常量池中除了包含代碼中所定義的各類基本類型(如int、long等等)和對象型(如String及數組)的常量值外,還包含一些以文本形式出現的符號引用,好比:接口

    類和接口的全限定名;內存

    字段的名稱和描述符;字符串

    方法和名稱和描述符。get

        在Java語言中,一切都是動態的。編譯時,若是發現對其它類方法的調用或者對其它類字段的引用的語句,記錄進class文件中的只能是一個文本形式的符號引用,在鏈接過程當中,虛擬機根據這個文本信息去查找對應的方法或字段。編譯器

        因此,與Java語言中的所謂「常量」不一樣,class文件中的「常量」內容很非富,這些常量集中在class中的一個區域存放,一個緊接着一個,這裏就稱爲「常量池」。

           在Java程序中,有不少的東西是永恆的,不會在運行過程當中變化。好比一個類的名字,一個類字段的名字/所屬類型,一個類方法的名字/返回類型/參數名與所屬類型,一個常量,還有在程序中出現的大量的字面值。

好比下面小段源碼中粗體代碼顯示的部分:

        public class ClassTest {

        private String itemS ="咱們 ";

        private final int itemI =100 ;

        public void setItemS (String para ){...}

}

而這些在JVM解釋執行程序的時候是很是重要的。那麼編譯器將源程序編譯成class文件後,會用一部分字節分類存儲這些粗體代碼。而這些字節咱們就稱爲常量池。事實上,只有JVM加載class後,在方法區中爲它們開闢了空間才更像一個「池」。

具體結構  在Java程序中,有不少的東西是永恆的,不會在運行過程當中變化。好比一個類的名字,一個類字段的名字/所屬類型,一個類方法的名字/返回類型/參數名與所屬類型,一個常量,還有在程序中出現的大量的字面值。

好比下面小段源碼中粗體代碼顯示的部分:

public class ClassTest {

private String itemS ="咱們 ";

private final int itemI =100 ;

public void setItemS (String para ){...}

}

而這些在JVM解釋執行程序的時候是很是重要的。那麼編譯器將源程序編譯成class文件後,會用一部分字節分類存儲這些粗體代碼。而這些字節咱們就稱爲常量池。事實上,只有JVM加載class後,在方法區中爲它們開闢了空間才更像一個「池」。

相關文章
相關標籤/搜索