歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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
  }

Copyright © Linux教程網 All Rights Reserved