Java中數據存儲位置

1、寄存器:最快的存儲區, 由編譯器根據需求進行分配,我們在程序中無法控制.
2、棧:存放基本數據類型和對象的引用,但是對象本身不存放在棧中,而是存放在堆(new出來的對象)
3、堆:存放所有new出來的對象
4、靜態域:存放靜態成員(static定義的)
5、常量池:存放字符串常量和基本類型常量(public static final)
6、非RAM存儲:硬盤等永久存儲空間

這裏我們主要關心棧,堆和常量池,對於棧和常量池中的對象可以共享,對於堆中的對象不可以共享。棧中的數據大小和生命週期是可以確定的,當沒有引用指向數據時,這個數據就會消失。堆中的對象的由垃圾回收器負責回收,因此大小和生命週期不需要確定,具有很大的靈活性。

對於字符串:其對象的引用都是存儲在棧中的,如果是編譯期已經創建好(直接用雙引號定義的)的就存儲在常量池中,如果是運行期(new出來的)才能確定的就存儲在堆中。對於equals相等的字符串,在常量池中永遠只有一份,在堆中有多份。
如以下代碼:

public class Stack {
    private int c=6;
    public void test(int i) {
        System.out.println(i);
    }

    public static void main(String[] args) {
        int a = 1;
        int b=0;//
        System.out.println(a);
        Stack stack = new Stack();
        stack.test(b);
    }
}

1:局部變量:a數據局部變量且屬於基礎數據類型所以其引用和值都存在棧裏面,在其使用結束後自動從棧中消失
2:對象的引用:stack其對象引用存在棧裏面,對象(new Stack())存在堆裏面
3:stack.test(b):其中i是局部變量,引用和值都存在棧中,在其方法test使用結束後i會從棧中消失
4:成員變量c:對於成員變量和局部變量:成員變量就是方法外部,類的內部定義的變量;局部變量就是方法或語句塊內部定義的變量。局部變量必須初始化。
形式參數是局部變量,局部變量的數據存在於棧內存中。棧內存中的局部變量隨着方法的消失而消失。
成員變量存儲在堆中的對象裏面,由垃圾回收器負責回收。
5:常量:對於字符串:其對象的引用都是存儲在棧中的,如果是編譯期已經創建好(直接用雙引號定義的)的就存儲在常量池中,如果是運行期(new出來的)才能確定的就存儲在堆中。對於equals相等的字符串,在常量池中永遠只有一份,在堆中有多份。
如以下代碼:

String s1 = "china";  
String s2 = "china";  
String s3 = "china";  
String ss1 = new String("china");  
String ss2 = new String("china");  
String ss3 = new String("china");  

對於通過new產生一個字符串(假設爲”china”)時,會先去常量池中查找是否已經有了”china”對象,如果沒有則在常量池中創建一個此字符串對象,然後堆中再創建一個常量池中此”china”對象的拷貝對象。這也就是有道面試題:String s = new String(“xyz”);產生幾個對象?一個或兩個,如果常量池中原來沒有”xyz”,就是兩個。
對於基礎類型的變量和常量:變量和引用存儲在棧中,常量存儲在常量池中。
如以下代碼:

int i1 = 9;  
int i2 = 9;  
int i3 = 9;   
public static final int INT1 = 9;  
public static final int INT2 = 9;  
public static final int INT3 = 9;  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章