1. 程式人生 > >String對象內存分析

String對象內存分析

字符 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對象內存分析