一從根本上認識javalangString類和String池
首先我建議先看看String類的源碼實現這是從本質上認識String類的根本出發點從中可以看到
String類是final的不可被繼承public final class String
String類是的本質是字符數組char[] 並且其值不可改變private final char value[];
然後打開String類的API文檔可以發現
String類對象有個特殊的創建的方式就是直接指定比如String x = abcabc就表示一個字符串對象而x是abc對象的地址也叫做abc對象的引用
String對象可以通過+串聯串聯後會生成新的字符串也可以通過concat()來串聯這個後面會講述
創建字符串的方式很多歸納起來有三類
其一使用new關鍵字創建字符串比如String s = new String(abc);
其二直接指定比如String s = abc;
其三使用串聯生成新的字符串比如String s = ab + c;
Java運行時會維護一個String Pool(String池)JavaDoc翻譯很模糊字符串緩沖區String池用來存放運行時中產生的各種字符串並且池中的字符串的內容不重復而一般對象不存在這個緩沖池並且創建的對象僅僅存在於方法的堆棧區下面是個系統內存示意圖
二String對象的創建
String對象的創建也很講究關鍵是要明白其原理
原理當使用任何方式來創建一個字符串對象s時Java運行時(運行中JVM)會拿著這個X在String池中找是否存在內容相同的字符串對象如果不存在則在池中創建一個字符串s否則不在池中添加
原理Java中只要使用new關鍵字來創建對象則一定會(在堆區或棧區)創建一個新的對象
原理使用直接指定或者使用純字符串串聯來創建String對象則僅僅會檢查維護String池中的字符串池中沒有就在池中創建一個有則罷了!但絕不會在堆棧區再去創建該String對象
原理使用包含變量的表達式來創建String對象則不僅會檢查維護String池而且還會在堆棧區創建一個String對象
另外String的intern()方法是一個本地方法定義為public native String intern(); intern()方法的價值在於讓開發者能將注意力集中到String池上當調用 intern 方法時如果池已經包含一個等於此 String 對象的字符串(該對象由 equals(Object) 方法確定)則返回池中的字符串否則將此 String 對象添加到池中並且返回此 String 對象的引用
最後有幾點問題請大家注意String a; 與String a=null在作為類變量時候是等價的在局部變量則不同null表示一個空引用String a=null意思是在棧中聲明了a但是這個a沒有指向任何地址此時我們注意到String a 在棧中聲明了a但是也沒有指向任何地址但是java的語法檢查如果在局部變量中String a;是不能直接使用的String a=null中的這個a可以直接使用
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28768.html