簡單說:Java中的堆和棧

      1、共同點:堆和棧都是Java中用來在RAM中存放數據的地方。

      2、區別:

     (1)棧(Stack):Java中一個線程一個棧區,每一個棧中的元素都是私有的,不被其他棧所訪問。棧有後進先出的特點,棧中的數據大小與生存期都是確定的,缺乏靈活性,但是,存取速度比堆要快,僅次於CPU中的寄存器,另外棧中的數據是共享的。在Java中,所有的基本數據類型和引用變量(對象引用)都在棧中存儲,棧中數據的生存空間一般在當前的scopes內,也就是“{}”的部分,比如:函數的參數值,局部變量等,是自動清除的。

      基本數據類型:Java中的基本數據類型包括8種,分別是byte、short、int、long、float、double、boolean、char;

      通過以下例子說明: int  m=2;

                                       int  n=2;

      當定義的是基本數據類型時,這些字面值的數據,大小和生命週期皆可知;編譯器首先處理 int  m=2; 先是在棧中創建一個變量爲m的引用,然後查找有沒有值爲2的地址,沒有則開闢一個新的存放字面值爲2的地址,然後將m指向2的地址。接着處理 int  n=2; 在創建完n的引用變量之後,由於存在2這個數值,則將n指向2的地址。這樣會出現(m==n)爲true的情況,也就是m和n指向同一個地址。

      類對象的引用類型:與字面值的引用不同,當同時指向一個地址的類對象的引用,如果該對象的內部狀態發生改變,則另一個對象引用變量也發生變化。與之相反,當定義完m之後,修改m的值,即m=3,那麼n不會發生改變,依然等於2。

      

     (2)堆(Heap):Java中只有一個堆,被所有線程共享。堆中的數據沒有先後順序(邏輯上連續就好),堆中的數據不需要事先告訴編譯器它的生存期,可以動態的分配內存的大小(動態的申請內存空間),也就是這樣導致了存取速度慢。不再使用的數據由Java中的垃圾回收機制自動回收。在Java中由new創建出來的對象都是在堆中的,當垃圾回收機制檢測到某對象未被引用時,則自動銷燬該對象。

       包裝類數據:Java中的包裝數據類型包括Byte、Short、Integer、Long、Float、Double、Boolean、Character。這些數據類型都是存放在堆中的,Java中通過new( ) 操作顯示的告訴編譯器,當運行時根據需要動態創建,缺點就是速度慢。

       String類型:是一種特殊的包裝類,也是通過new( )操作動態的創建數據,比如:String s1=new String("abcd");

 

      (3)方法區:又叫靜態區,跟堆一樣,被所有的線程共享;方法區包含所有的class和static變量;方法區中包含的都是在整個程序中永遠唯一的元素,如class,static變量。

     

    

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