java常量池技術
java中的常量池技術,是爲了方便快捷地建立某些對象而出現的,當須要一個對象時,就能夠從池中取一個出來(若是池中沒有則建立一個),則在須要重複建立相等變量時節省了不少時間。常量池其實也就是一個內存空間,常量池存在於方法區中。
JVM的編譯器將源程序編譯成class文件後,會用一部分字節分類存儲這些粗體代碼。而這些字節咱們就稱爲常量池。其中包括了關於類,方法,接口等中的常量,也包括字符串常量,如String s ="java"這種申明方式;對於String s = "java",在編譯成.class時可以識別爲同一字符串的,自動優化成常量,因此若是有多個字符串"java",則它們都會引用自同一String對象。也就是說String s = "java" 其中"java"值在JAVA程序編譯期就肯定下來了的。(你們能夠用UE編輯器或其它文本編輯工具在打開class文件後的字節碼文件中看到這個java值)。這個java存在在常量池中。注意:常量池只存儲文字字符串值,不存儲符號引用。
而在運行時建立的字符串具備獨立的內存地址,因此不引用自同一String對象.String的intern()方法會查找在常量池中是否存在一份equal相等的字符串,若是有則返回一個引用,沒有則添加本身的字符串進入常量池,注意:只是字符串部分。因此這時會存在2份拷貝,常量池的部分被String類私有並管理,本身的那份按對象生命週期繼續使用。String s = new String("java");語句,到底建立了幾個對象呢? "java"自己就是常量池中的一個對象,而在運行時執行new String()時,將常量池中的對象複製一份放到堆中,而且把堆中的這個對象的引用交給s持有。因此這條語句就建立了2個String對象。
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" Strings4="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這個變量再也不指向它了。
八種基本類型的包裝類和對象池 java中基本類型的包裝類的大部分都實現了常量池技術,這些類是Byte,Short,Integer,Long,Character,Boolean,另外兩種浮點數類型的包裝類則沒有實現。另外Byte,Short,Integer,Long,Character這5種整型的包裝類也只是在對應值小於等於127時纔可以使用常量池
Integer a = new Integer(128);
Integer b = new Integer(128);
這個時候再問你,輸出結果是什麼?你就知道是false了。若是把這個數換成127,再執行:
Integer a = 127;
Integer b = 127;
System.out.println(a == b);
結果就是:true
進行對象比較時最好仍是使用equals,便於按照本身的目的進行控制。這裏引出equals()和==,equals比較的是字符串字面值即比較內容,==比較引用。