天天看點

# Java中各種資料的在虛拟機記憶體中的存儲方式(超具象!!)Java中各種資料的在虛拟機記憶體中的存儲方式(超具象!!)

Java中各種資料的在虛拟機記憶體中的存儲方式(超具象!!)

一、前提須知

1.前提:

資料類型,分為

       基本資料類型(數值型,字元型,布爾型)

                           和

       引用類型(類,接口,數組,[當然引用類型也有根據引用級别來進行分類的]);

可以到以下連結對各種資料類型進行了解:
[link](https://wenku.baidu.com/view/c2172a33dd3383c4ba4cd216.html)
           

2.任何資料類型在聲明時都會在棧中開辟記憶體空間;

3.虛拟機記憶體分為棧、方法區、堆三個部分;

4.一般讨論記憶體,都是預設讨論方法區和堆中的記憶體,而不讨論棧中記憶體(可能是聲明時一定會開辟空間,是以預設不算)

二、根據資料類型的不同,讨論各種資料在記憶體中的存儲方式

1.基本資料類型

*聲明時,隻在棧中開辟空間,初始化(即指派時),值也是放在棧中;

# Java中各種資料的在虛拟機記憶體中的存儲方式(超具象!!)Java中各種資料的在虛拟機記憶體中的存儲方式(超具象!!)

       此時,在棧中會開辟一個叫a的房間,裡面就住着123;

# Java中各種資料的在虛拟機記憶體中的存儲方式(超具象!!)Java中各種資料的在虛拟機記憶體中的存儲方式(超具象!!)

2.引用類型(String類型較特殊)

       聲明時,在棧中開辟空間,初始化(即指派時),會在方法區和堆開辟記憶體空間,方法區記憶體空間中放的是引用類型變量的值,堆中空間放的則是對應值在方法區中的位址(堆中存放的都是位址);

# Java中各種資料的在虛拟機記憶體中的存儲方式(超具象!!)Java中各種資料的在虛拟機記憶體中的存儲方式(超具象!!)

       此時,會在棧中開一個叫b的房間,房間裡放着一把鑰匙(b在堆中的位址001),而在堆中也會開辟一個房間(假設是001号房間),001房間放着3把鑰匙(b的值1、2、3的3個位址A,B,C),在方法區中會開辟三個房間A,B,C,裡面分别放着1,2,3

PS:建立b的時候總共開辟了四個記憶體空間(在堆中的1個房間,在方法區中的三個房間);

# Java中各種資料的在虛拟機記憶體中的存儲方式(超具象!!)Java中各種資料的在虛拟機記憶體中的存儲方式(超具象!!)

3.特殊的String類型

       String類型資料,同樣會在方法區和堆開辟記憶體空間,但是在方法區中有個字元串常量池(String類型專用) ,用來存放String類型對象的值

# Java中各種資料的在虛拟機記憶體中的存儲方式(超具象!!)Java中各種資料的在虛拟機記憶體中的存儲方式(超具象!!)
String c = "死魚不要太安樂";         //建立string類型變量c
String d = new String("死魚有點南");   //建立一個String類型的對象d
String e = new String("死魚有點南")
           

此時,在棧中和堆中開辟房間的方式和其他引用類型資料一樣,而在方法區中的字元串常量池,其中隻開辟了兩個房間D,E,放着"死魚不要太安樂"以及"死魚有點南",因為字元串常量池中若值相同則隻會開辟一個記憶體空間。

PS:建立d,e對象的時候總共開辟了三個記憶體空間(2個堆中的房間,1個方法區中字元串常量池中的房間);

# Java中各種資料的在虛拟機記憶體中的存儲方式(超具象!!)Java中各種資料的在虛拟機記憶體中的存儲方式(超具象!!)

       此時的若輸出 d==e 的布爾值(下圖b代表d,c代表e),結果為:

# Java中各種資料的在虛拟機記憶體中的存儲方式(超具象!!)Java中各種資料的在虛拟機記憶體中的存儲方式(超具象!!)

原因:         “==” 比較運算符隻會比較變量的位址,而b,c在堆中的房間号(即位址一個為002,一個為003)是不同的,是以結果為false

以上皆為個人了解及看法,内容還待補充,若有誤還望請教以便及時更正