Java中各種資料型別的儲存-堆/棧
阿新 • • 發佈:2019-01-06
Java的記憶體分兩種:棧記憶體和堆記憶體
棧記憶體:在函式中定義的基本型別變數和引用變數都在棧記憶體中分配
例如:
public void test(){
int a = 1;
Person p = new Person();
p.setAge(1);
}
這個方法中的a,1,p都是在佔記憶體中分配的,但是new出的Person物件是在堆記憶體中。其中a和p是引用變數,1是基本資料型別變數。
堆記憶體:new創建出的物件,陣列以及物件的例項變數
例如:
public class Person{
public int age;
//....
public void setAge(int age){
this.age = age;
}
}
在test方法的例子中,new出的Person物件,Person類中的age例項變數存在堆中。setAge方法中的int age是引用,存在棧中。
棧記憶體有個優點,棧記憶體中的資料可以共享,速度快;對於可以共享,例如:
int a = 3;
int b = 3;
int c = 4;
由於基本資料型別大小可知,生存週期可知(定義在方法中,方法退出之後自動銷燬),所以出於追求速度,存放在棧中,當定義了欄位3給a之後,再定義b時,首先找有沒有以3為欄位的地址,如果有,讓b也指向3,也就是說a和b的地址是一樣的,上兩句程式碼也就等同於int b = a; 當定義c時,發現沒有欄位4,那麼重新開闢存放欄位4的地址,讓引用c指向欄位4。