java對象內存的存儲

(此次純屬做筆記,有錯誤請評論,謝謝大家)
1 對於基礎類型的變量和常量:變量和引用存儲在棧中,常量存儲在常量池中。
對象的具體信息保存在堆中。常量池的速度是最快的。
常量包括兩個:一個是直接定義的string,一個是final類型的變量
常量池:string s = “aa”; final int s = 9;
棧中:int a = 5;
2 對於成員變量和局部變量:
成員變量就是方法外部,類的內部定義的變量,可以不用初始化;
局部變量就是方法或者語句塊內部定義的變量,局部變量必須要初始化。
形式參數指的是方法參數列表中的變量,他是局部變量。
局部變量的數據存在於棧中,棧內存中的局部變量隨着方法的完成而消失。
成員變量存儲在中的對象裏面,由垃圾回收器負責回收。

3 String str = “abc”;–創建對象的過程
1)首先在常量池中查找是否存在內容爲“abc”的字符串對象
2)如果不存在,則在常量池中創建“abc”,並讓str引用該對象
3)如果存在,則直接讓str引用該對象
String str = new String(“abc”)–創建對象的過程
1)首先在堆中創建一個指定的對象“abc”,並讓str引用指向該對象
2)在字符串常量池中查看,是否存在內容爲“abc”的字符串對象
3)如果存在,則將new出來的字符串對象與字符串常量池中的對象聯繫起來
4)如果不存在,則在字符串常量池中創建一個內容爲“abc”的字符串對象,並將堆中的對象與之聯繫起來。

String str = new String(“abc”);會產生幾個對象?
一個或兩個。如果常量池中原來沒有“abc”,就是兩個,如果常量池中有”abc“,就是一個;

4 對於int i=2,j=2;
首先會在棧中創建一個變量爲i的引用,然後查找有沒有字面值爲2的地址, 沒有的話就會開闢一個存在2這個字面值的地址,然後將i指向2的地址。對於int j同樣 查找有沒有字面值爲2的地址,如果有的話,也是將2的地址指向j,這樣就會出現
同時指向2的兩個變量。

Integer it1 = 2,it2 = 2;Integer it1 = 250,it2 = 250;
java的自動拆箱和裝箱
在自動裝箱的時候,把int變爲Integer的時候,存在一定的規則,當int的值在-128到127時, 返回的不是一個新new出來的Integer對象,而是一個已經緩存在堆中的Integer對象,(系統 已經把-128到127之間的Integer緩存到一個Integer數組中去了) 。
當裝箱的時候,首先去緩存中找,如果找到的話就直接返回引用,不用new,如果不在
-128-127中間,會返回一個新new出來的Integer對象。
Integer it1 = 2;
Integer it2 = 2;
it1==it2;//返回值true
Integer it1 = 128;
Integer it2 = 128;
it1==it2;//返回值false
Integer it1 = new Integer(2);
Integer it2 = new Integer(2);
it1==it2;//返回值false

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