1.java程序運行時有6中地方存儲數據,分別是:寄存器、棧、堆、靜態存儲、常量存儲、非RAM(隨機存儲器),主要是堆與棧的存儲。
2.堆與棧是java用來在RAM中存儲數據的地方,java自動管理堆和棧,程序員不能直接設置堆和棧。
3.棧的優勢是:存取速度比堆要快,僅次於直接位於cpu中的寄存器;棧數據可以共享。 但缺點是:存在棧中數據大小與生命周期必須是確定的,缺乏靈活性。
4.堆的優勢在於可以動態分配內存大小,生存期也不必事先告訴編譯器,java的垃圾收集器會自動收走這些不再使用的數據,缺點是由於要在運行時動態分配內存,存取速度較慢。
5.基本數據類型的存儲,java的基本數據類型共有8種:int,short,byte,long,float,double,boolean,(基本數據類型中並沒有String的基本類型)。這種類型如int=3的形式來定義,稱為自動變量。自動變量存在的是字面值,即不是類的實例,也不是類的引用。a 是一個指向int類型的引用,指向3這個字面值。這些字面值的數據由於大小可知,生存期可知(這些字面值固定定義在某個程序塊里面,程序塊退了,字段值就消失了),處於追求速度的原因就存在棧中。
6.另外棧有一個很重要的特殊性,就是存在棧中的數據可以共享。如 需要定義int a = 3; int b =3;這兩個自動變量。編譯器先處理int a=3;首先在棧中創建一個變量為a的引用,然后查找棧有沒有字面值為3的引用,沒有找到,就開辟一個存放3這個字面值的地址,然后將a指向3的地址。接着處理int b=3;在創建完b這個引用變量后,由於在棧中已經有了3這個字面值,即將b直接指向3的地址。這樣,就出現了a和b同事指向3的情況。 定義完a與b后,在令a=4,那么b不會等於4,而是等於3,。在編譯器內部,遇到時,它就會中新搜索棧中是否有4這個字面值,如果沒有,重新開辟地址存放4的值。如果已經有就直接將a指向這個地址,因此a的值改變不會影響b的值。
7.對象的內存模型.創建一個對象包括對象的聲明和實例化兩步:聲明對象的引用和對象的實例化。聲明一個對象引用時,將在棧內存為對象的引用變量分配空間;對象實例化是,在堆內存中為類成員變量分配內存,並將其初始化為各數據類型默認值,接着進行顯示初始化,最后調用構造方法為成員變量賦值,返回堆內存中對象的引用(相當於首地址)給應用變量,通過引用變量來引用堆內存中的對象。
8.包裝類數據的存儲:基本數據類型的定義都是直接在棧中,如果是包裝類型來創建對象,就和普通對象一樣。
9.string數據類型是一種特殊數據類型,既可以用基本數據類型格式來創建,也可以用普通基本類型來創建。