Java中的堆、棧 和常量池

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

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

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

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

   舉個例子吧!

   String str1="abc";

   String str2="abc";

   String str3="abc";

   String str4=new String("abc");

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

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

   java中的堆、棧和常量池
      對於成員變量和局部變量來說,成員變量是方法外部,類得內部定義的變量。局部變量就是方法或語句塊內部定義的變量,注意,局部變量必須初始化。 說到java中堆、棧和常量池,首先還是看看他們各自存放的數據類型吧!
 堆:存放所有new出來的對象;棧:存放基本類型的變量數據和對象的應用,對象(new出來的對象)本身並不存在棧中,而是存放在堆中或者常量池中(字符串常量對象存放在常量池中);常量池:存放基本類型常量和字符串常量。
對於棧和常量池中的對象可以共享,對於堆中的對象不可以共享。棧中的數據大小和生命週期是可以確定的,當沒有引用指向數據時,這個數據就會自動消失。堆中的對象的由垃圾回收器負責回收,因此大小和生命週期不需要確定,具有很大的靈活性。
    而對於字符串來說,其對象的引用都是存儲在棧中的,如果是編譯期已經創建好(即指用雙引號定義的)的就存儲在常量池中,如果是運行期(new出來的對象)則存儲在堆中。對於equals相等的字符串,在常量池中是隻有一份的,在堆中則有多份。
   舉個例子吧!
   String str1="abc";
   String str2="abc";
   String str3="abc";

   String str4=new String("abc");
   String str5=new String("abc");java中的堆、棧和常量池


對於淺藍色箭頭,通過new操作產生一個字符串(“abc”)時,會先去常量池中查找是否有“abc”對象,如果沒有則在常量池中創建一個此字符串對象,然後堆中再創建一個常量池中此“abc”對象的拷貝對象,所以,對於String str=new String("abc"),如果常量池中原來沒有"abc"則產生兩個對象,否則產生一個對象。
   而對於基礎類型的變量和常量,變量和引用存儲在棧中,常量存儲在常量池
中。例如:

   java中的堆、棧和常量池


java中的堆、棧和常量池
      對於成員變量和局部變量來說,成員變量是方法外部,類得內部定義的變量。局部變量就是方法或語句塊內部定義的變量,注意,局部變量必須初始化。
     局部變量(形式參數)的數據存於棧內存中,並且它(局部變量)隨方法的消失而消失。

     局部變量(形式參數)的數據存於棧內存中,並且它(局部變量)隨方法的消失而消失。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章