天天看點

JAVA【堆】【棧】【常量池】說明

說到java中堆、棧和常量池,首先還是看看他們各自存放的資料類型

 堆:存放所有new出來的對象;棧:存放基本類型的變量資料和對象的應用,對象(new出來的對象)本身并不存在棧中,而是存放在堆中或者常量池中(字元串常量對象存放在常量池中);常量池:存放基本類型常量和字元串常量。

對于棧和常量池中的對象可以共享,對于堆中的對象不可以共享。棧中的資料大小和生命周期是可以确定的,當沒有引用指向資料時,這個資料就會自動消失。堆中的對象的由垃圾回收器負責回收,是以大小和生命周期不需要确定,具有很大的靈活性。

   而對于字元串來說,其對象的引用都是存儲在棧中的,如果是編譯期已經建立好(即指用雙引号定義的)的就存儲在常量池中,如果是運作期(new出來的對象)則存儲在堆中。對于equals相等的字元串,在常量池中是隻有一份的,在堆中則有多份。

   舉個例子吧!

   Stringstr1="abc";

   String str2="abc";

   String str3="abc";

   String str4=newString("abc");

   String str5=newString("abc");

JAVA【堆】【棧】【常量池】說明

對于淺藍色箭頭,通過new操作産生一個字元串(“abc”)時,會先去常量池中查找是否有“abc”對象,如果沒有則在常量池中建立一個此字元串對象,然後堆中再建立一個常量池中此“abc”對象的拷貝對象,是以,對于Stringstr=new String("abc"),如果常量池中原來沒有"abc"則産生兩個對象,否則産生一個對象。

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

JAVA【堆】【棧】【常量池】說明
JAVA【堆】【棧】【常量池】說明

     對于成員變量和局部變量來說,成員變量是方法外部,類得内部定義的變量。局部變量就是方法或語句塊内部定義的變量,注意,局部變量必須初始化。

    局部變量(形式參數)的資料存于棧記憶體中,并且它(局部變量)随方法的消失而消失。