一從根本上認識javalangString類和String池
首先
我建議先看看String類的源碼實現
這是從本質上認識String類的根本出發點
從中可以看到
String類是final的
不可被繼承
public final class String
String類是的本質是字符數組char[]
並且其值不可改變
private final char value[];
然後打開String類的API文檔
可以發現
String類對象有個特殊的創建的方式
就是直接指定比如String x =
abc
abc
就表示一個字符串對象
而x是
abc
對象的地址
也叫做
abc
對象的引用
String對象可以通過
+
串聯
串聯後會生成新的字符串
也可以通過concat()來串聯
這個後面會講述
Java運行時會維護一個String Pool(String池)
JavaDoc翻譯很模糊
字符串緩沖區
String池用來存放運行時中產生的各種字符串
並且池中的字符串的內容不重復
而一般對象不存在這個緩沖池
並且創建的對象僅僅存在於方法的堆棧區
下面是個系統內存示意圖
創建字符串的方式很多
歸納起來有三類
其一
使用new關鍵字創建字符串
比如String s
= new String(
abc
);
其二
直接指定
比如String s
=
abc
;
其三
使用串聯生成新的字符串
比如String s
=
ab
+
c
;
二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/28607.html