字符串池StringPool詳解

        對於java程序中的字符直接量(即採用字面值方式賦值,型如:String s1 = "aaaa";),JVM會使用一個字串池StringPool來保存它們。當第一次使用某個字符串直接量時,JVM會將它放入字符串池中進行緩存。在一般情況下,字符串池中的字符串對象不會被垃圾回收。當程序再次需要使用該字符串時,無需重新創建一個新的字符串就可以直接讓引用變量直接指向字符串中已有的字符串。而使用new操作創建的字符串對象(即型如:String s2 = new String("aaa");)不指向字符串池中的對象,但是可以使用intern方法使其指向字符串池中的對象。

 

 

   String a = "ab";
   String b = "a"+"b";

   //這裏的"a"、"b"不是變量,是常量,當使用“+”拼接字符串時,會產生新的String對象,而不是對原有的String對象的追加內容。
   System.out.println(a==b); //輸出結果爲true,對於String對象的相等性比較,最好使用equals()方法,而不使用“==”。
  
   String str1 = "java"; //在編譯時就知道對象放在常量池
   String str2 = "blog";
   String str = str1 + str2;
   //str1、str2是變量在運行時刻才能知道,也就是說str1+str2是在裏創建的
   System.out.println(str);  //輸出結果爲javablog
   System.out.println(str=="javablog"); //輸出結果爲false

String str1 = "abc";  

String str2 = "abc";

String str3 = "def";

String str4 = "abcdef";  

String str5 = "abc" + "def";//在字符串池中能找到“abcdef”對象,故str5 == str4 爲true

String str6 = str2 + str3;//在運行時才知道,也就是說str1+str2是在堆裏創建的  

String str7 = new String("abcdef");//new操作創建的字符串對象不指向字符串池中的對象  

String str8 = str7.intern();//使用intern方法使str7指向的對象加入字符串池中

      Java運行環境有一個字符串池,由String類維護。執行語句String str="abc"時,首先查看字符串池中是否存在字符串"abc",如果存在則直接將"abc"賦給str,如果不存在則先在字符串池中新建一個字符串"abc",然後再將其賦給str。執行語句String str=new String("abc")時,不管字符串池中是否存在字符串"abc",直接新建一個字符串"abc"(注意:新建的字符串"abc"不是在字符串池中,而是在堆中創建),然後將其付給str。前一語句的效率高,後一語句的效率低,因爲新建字符串佔用內存空間。String str = new String()創建了一個空字符串,與String str=new String("")相同。

-------------------------------------------------------------------------------------------------------------------

      因爲字符串池中的字符串對象不會被垃圾回收,所以當某個字符串池中的字符串對象失去引用時,它將變成垃圾,而字符串池又不回收。於是便產生了java內存泄露。示例如下:

發佈了13 篇原創文章 · 獲贊 5 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章