String StringBuffer StringBuilder 區別整理

一.先說一下String 這個類

     常量池

           常量池(Constant Pool):指的是在編譯期被確定,並被保存在已編譯的.class文件中的一些數據。JVM虛擬機爲每個被裝載的類型維護一個常量池。常量池就是該類型所用到常量的一個有序集和,包括直接常量(String,Integer和 Floating point常量)和對其他類型,字段和方法的符號引用。對於String常量,它的值是在常量池中的。而JVM中的常量池在內存當中是以表的形式存在的, 對於String類型,有一張固定長度的CONSTANT_String_info表用來存儲文字字符串值,注意:該表只存儲文字字符串值,不存儲符號引用。

     1.String s = "abc";
    創建過程分析:在class文件被JVM裝載到內存中,JVM會創建一塊String Pool(String緩衝池)。當執行String s = “abc”;時,JVM首先在String Pool中查看是否存在字符串對象“abc”(如何查看呢?用equals()方法判斷),如果已存在該對象,則不用創建新的字符串對象“abc”,而直接使用String Pool中已存在的對象“abc”,然後將引用s指向該對象;如果不存在該對象,則先在String Pool中創建一個新的字符串對象“abc”,然後將引用s指向String Pool中創建的新對象。 


注意:使用“字符串常量”引號創建的字符串對象時,在編譯期就已經確定將該對象存儲到String Pool中了。因此,String s = “abc”只會在編譯期,在String Pool中創建一個對象。

      String s1 = "abc";
      String s2 = "abc";
      System.out.println(s1 == s2);//true

結果說明:JVM創建了兩個引用str1和str2,但在String Pool中只創建了一個對象,而且兩個引用都指向了同一個對象。

   2.String s = new String("abc");

      創建過程分析:當執行String s = new String(“abc”);時,JVM首先在String Pool中查看是否存在字符串對象“abc”,如果不存在該對象,則先在String Pool中創建一個新的字符串對象“abc”,然後執行new String(“abc”)構造方法,在Heap裏又創建一個新的字符串對象“abc”(new出來的對象都放在Heap裏面),並將引用s指向Heap中創建的新對象;如果已存在該對象,則不用創建新的字符串對象“abc”,而直接使用String Pool中已存在的對象“abc”, 然後執行new String(“abc”)構造方法,在Heap裏又創建一個新的字符串對象“abc”,並將引用s指向Heap中創建的新對象。

注意:使用new String(“”)創建的字符串對象時,會在運行期創建新對象存儲到Heap中。因此,new String(“abc”)創建字符串對象時,會創建2個對象,編譯期在String Pool中創建一個,運行時Heap中創建一個。

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章