1. 程式人生 > >Java中各種資料型別的儲存-堆/棧

Java中各種資料型別的儲存-堆/棧

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。