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後,在方法區中爲它們開闢了空間才更像一個「池」。