String類內存空間詳解


java.lang.String類內存問題詳解

  • 字符串理解的難點在於其在堆內存空間上的特殊性,字符串String對象在堆內存上有兩種空間:
    1. 字符串池(String pool):特殊的堆內存,專門存放String對象,且不會有重復的值。
    2. 普通堆內存空間:此處的String對象一般是通過調用new操作符得到。
  • 兩種字符串內存空間處理字符串的優先級關系:
    • 字符串池(String pool)對普通堆內存空間說:
      1. 凡是你擁有的、且不管你同樣的內容有多少份,我一定會只會保存一份;
      2. 我有的,你不必一定擁有。

         

        public class StringPool {
            
            public static void main(String[] args) {
                //只會在字符串池創建一份“aaa”,str1指向字符串池中的某個地址
                String str1 = "aaa";
                
                //先在字符串池創建一份“bbb”,然后聽從new的指示,在普通堆內存開辟空間存儲一份“bbb”
                //str2指向普通堆內存空間上的一個地址
                String str2 = new String("bbb");
                //字符串池心里已經有了"bbb",不會再有第二份了。但是new還是要在普通內存空間存一份“bbb”
                String str3 = new String("bbb");
                
                // == 比較的是否是同一個對象(內存地址是否一樣)
                // str.intern(),返回一個字符串池里的、和當前str的值equals的字符串的地址引用
                System.out.println(str1 == "aaa".intern());
                
                System.out.println(str2 == "bbb".intern());
                
                //new調用一次,開辟一次普通內存空間
                //但不論new多少次,相同value的字符串,字符串池只存一份
                System.out.println(str2 == str3);
                System.out.println(str2.intern() == str3.intern());
            }
        
        }
        View Code

         

         

    • 最佳實踐:能用""創建字符串,就不用new創建。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM