Java之內存分析和String對象

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)
複製代碼
public class TestStr { 
  public static void main(String[] args) { 
    // 以下兩條語句創建了1個對象。"鳳山"存儲在字符串常量池中 
    String str1 = "鳳山"; 
    String str2 = "鳳山"; 
    System.out.println(str1==str2);//true 
     
    //以下兩條語句創建了3個對象。"天峨",存儲在字符串常量池中,兩個new String()對象存儲在堆內存中 
    String str3 = new String("天峨"); 
    String str4 = new String("天峨"); 
    System.out.println(str3==str4);//false 
     
    //以下兩條語句創建了1個對象。9是存儲在棧內存中 
    int i = 9; 
    int j = 9; 
    System.out.println(i==j);//true 
     
    //由於沒有了裝箱,以下兩條語句創建了2個對象。兩個1對象存儲在堆內存中 
    Integer l1 = new Integer(1); 
    Integer k1 = new Integer(1); 
    System.out.println(l1==k1);//false 
  //以下兩條語句創建了1個對象。1對象存儲在棧內存中。自動裝箱時對於值從127之間的值,使用一個實例。
    Integer l = 20;//裝箱 
    Integer k = 20;//裝箱 
    System.out.println(l==k);//true 
//以下兩條語句創建了2個對象。i1,i2變量存儲在棧內存中,兩個256對象存儲在堆內存中 
    Integer i1 = 256; 
    Integer i2 = 256; 
    System.out.println(i1==i2);//false 
  } 
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章