深入瞭解Java的String – JAVA編程語言程序開發技術文章

ggmm


一、從根本上認識 java.lang.String類和 String池


 


     首先,我建議先看看 String類的源碼實現,這是從本質上認識 String類的根本出發點。從中可以看到:


        1、 String類是 final的,不可被繼承。 public final class String。


        2、 String類的本質是字符數組 char[], 並且其值不可改變。 private final char value[];然後打開 String類的 API文檔,可以發現。


        3、 String類對象有個特殊的創建的方式,就是直接指定比如 String x = “abc”, “abc”表示一個字符串對象,而 x是 “abc”對象的地址,也叫做 “abc”對象的引用。


        4、 String對象可以通過“ +”串聯。串聯後會生成新的字符串,也可以通過 concat()來串聯,這個後面會講述。


        5、 Java 運行時會維護一個 String Pool( String池), Java Doc翻譯很模糊“字符串緩沖區”。 String池用來存放運行時中產生的各種字符串,並且池中的字符串的內容不重復。而一般對象不存在這個緩沖池,並且創建的對象僅僅存在於方法的堆棧區。下面是個系統內存示意圖:


 


 


         6、創建字符串的方式很多,歸納起來有三類:


                 其一,使用 new關鍵字創建字符串,比如 String s1 = new String(“abc”);


                 其二,直接指定。比如 String s2 = “abc”;


                 其三,使用串聯生成新的字符串。比如 String s3 = “ab” + “c”;


 


二、 String對象的創建


 


       String對象的創建也很講究,關鍵是要明白其原理。


       原理 1:當使用任何方式來創建一個字符串對象 s時, Java運行時(運行中 JVM)會拿著這個 X在 String池中找是否存在內容相同的字符串對象,如果不存在,則在池中創建一個字符串 s,否則,不在池中添加。


 


       原理 2: Java中,隻要使用 new關鍵字來創建對象,則一定會(在堆區或棧區)創建一個新的對象。


 


       原理 3:使用直接指定或者使用純字符串串聯來創建 String對象,則僅僅會檢查維護 String池中的字符串,池中沒有就在池中創建一個,有則罷瞭!但絕不會在堆棧區再去創建該 String對象。


 


       原理 4:使用包含變量的表達式來創建 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可以直接使用

發佈留言