java 中的堆 棧和常量池

      棧:

           存放基本類型的變量數據和對象的引用,但對象本身不存放在棧中,而是存放在堆(new 出來的對象)或者常量池中(字符串常量對象存放在常量池中。)

 . 堆:

            存放所有new出來的對象。

   靜態域:

            存放靜態成員(static定義的)

   .  常量池:

            存放字符串常量和基本類型常量(public static final)。

        對於棧和常量池中的對象可以共享,對於堆中的對象不可以共享。

           棧中的數據大小和生命週期是可以確定的, 當沒有引用指向數據時,這個數據就會消失。

         堆中的對象的由垃圾回收器負責回收,因此大小和生命週期不需要確定,具有很大的靈活性。

  對於字符串:

            其對象的引用都是存儲在棧中的,

                  如果是編譯期已經創建好(直接用雙引號定義的)的就存儲在常量池中,

                   如果是運行期(new出來的)才能確定的就存儲在堆中。

                  對於equals相等的字符串,在常量池中永遠只有一份,在堆中有多份。

  如以下代碼:

  String s1 = "china";

  String s2 = "china";

  String s3 = "china";

  String ss1 = new String("china");

  String ss2 = new String("china");

  String ss3 = new String("china");

  

  對於基礎類型的變量和常量:變量和引用存儲在棧中,常量存儲在常量池中。

  如以下代碼:

  Java代碼

  int i1 = 9;

  int i2 = 9;

  int i3 = 9;

  public static final int INT1 = 9;

  public static final int INT2 = 9;

  public static final int INT3 = 9;

  

  對於成員變量和局部變量:

            成員變量

                              就是方法外部,類的內部定義的變量;

          局部變量

                             就是方法或語句塊內部定義的變量。

                           局部變量必須初始化

          形式參數是局部變量

                           局部變量的數據存在於棧內存中

                         棧內存中的局部變量隨着方法的消失而消失。

      成員變量存儲在堆中的對象裏面,由垃圾回收器負責回收。

  如以下代碼:

  Java代碼

  class BirthDate {

  private int day;

  private int month;

  private int year;

  public BirthDate(int d, int m, int y) {

  day = d;

  month = m;

  year = y;

  }

  省略get,set方法………

  }

  public class Test{

  public static void main(String args[]){

  int date = 9;

  Test test = new Test();

  test.change(date);

  BirthDate d1= new BirthDate(7,7,1970);

  }

  public void change1(int i){

  i = 1234;

  }

  

  對於以上這段代碼,date爲局部變量,i,d,m,y都是形參爲局部變量,day,month,year爲成員變量。下面分析一下代碼執行時候的變化:

  1. main方法開始執行:int date = 9;

  date局部變量,基礎類型,引用和值都存在棧中。

  2. Test test = new Test();

  test爲對象引用,存在棧中,對象(new Test())存在堆中。

  3. test.change(date);

  i爲局部變量,引用和值存在棧中。當方法change執行完成後,i就會從棧中消失。

  4. BirthDate d1= new BirthDate(7,7,1970);

  d1爲對象引用,存在棧中,對象(new BirthDate())存在堆中,其中d,m,y爲局部變量存儲在棧中,且它們的類型爲基礎類型,因此它們的數據也存儲在棧中。day,month,year爲成員變量,它們存儲在堆中(new BirthDate()裏面)。當BirthDate構造方法執行完之後,d,m,y將從棧中消失。

  5.main方法執行完之後,date變量,test,d1引用將從棧中消失,new Test(),new BirthDate()將等待垃圾回收。


發佈了51 篇原創文章 · 獲贊 1 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章