String對象內存分析
阿新 • • 發佈:2017-10-17
字符 ron tac pool 2個 內存分析 http cnblogs test
Java中內存分析:
棧(Stack) :存放基本類型的變量數據和對象的引用,但對象本身不存放在棧中,而是存放在堆(new 出來的對象)或者常量池中(字符串常量對象存放在常量池中)。 堆(heap):存放所有new出來的對象。 常量池(constant pool):在堆中分配出來的一塊存儲區域,存放儲顯式的String常量和基本類型常量(float、int等)。另外,可以存儲不經常改變的東西(public static final)。常量池中的數據可以共享。 靜態存儲:存放靜態成員(static定義的)。
1)
String a = "abc";① String b = "abc";②
分析:
①代碼執行後在常量池(constant pool)中創建了一個值為abc的String對象。
②執行時,因為常量池中存在"abc"所以就不再創建新的String對象了。
2)String c = new String("xyz");① String d = new String("xyz");②
分析:
①Class被加載時,"xyz"被作為常量讀入,在常量池(constant pool)裏創建了一個共享的值為"xyz"的String對象;然後當調用到new String("xyz")的時候,會在堆(heap)裏創建這個new String("xyz")對象;
②由於常量池(constant pool)中存在"xyz"所以不再創建"xyz",然後創建新的new String("xyz")。
3)
String s1 = new String("xyz"); //創建二個對象(常量池和堆中),一個引用 String s2 = new String("xyz"); //創建一個對象(堆中),並且以後每執行一次創建一個對象,一個引用 String s3 = "xyz"; //創建一個對象(常量池中),一個引用 String s4 = "xyz"; //不創建對象(共享上次常量池中的數據),只是創建一個新的引用
4)
1 public class TestStr { 2 public static void main(String[] args) { 3 // 以下兩條語句創建了1個對象。"鳳山"存儲在字符串常量池中 4 String str1 = "鳳山"; 5 String str2 = "鳳山"; 6 System.out.println(str1==str2);//true 7 8 //以下兩條語句創建了3個對象。"天峨",存儲在字符串常量池中,兩個new String()對象存儲在堆內存中 9 String str3 = new String("天峨"); 10 String str4 = new String("天峨"); 11 System.out.println(str3==str4);//false 12 13 //以下兩條語句創建了1個對象。9是存儲在棧內存中 14 int i = 9; 15 int j = 9; 16 System.out.println(i==j);//true 17 18 //由於沒有了裝箱,以下兩條語句創建了2個對象。兩個1對象存儲在堆內存中 19 Integer l1 = new Integer(1); 20 Integer k1 = new Integer(1); 21 System.out.println(l1==k1);//false 22 //以下兩條語句創建了1個對象。1對象存儲在棧內存中。自動裝箱時對於值從127之間的值,使用一個實例。 23 Integer l = 20;//裝箱 24 Integer k = 20;//裝箱 25 System.out.println(l==k);//true 26 //以下兩條語句創建了2個對象。i1,i2變量存儲在棧內存中,兩個256對象存儲在堆內存中 27 Integer i1 = 256; 28 Integer i2 = 256; 29 System.out.println(i1==i2);//false 30 } 31 }
String對象內存分析