java 資料儲存方式

samay發表於2017-09-22

java 資料儲存主要有五種方式:暫存器,棧儲存,堆儲存,常量池,非RAM儲存區

1.暫存器
java資料儲存中最快的區域,位於處理器中,但是空間是最少的。該區域由根據需求自動分配,由系統管理。

2.棧儲存
該儲存區域位於RAM中,存取速度僅次於暫存器。資料結構是棧,具有先進先出的特點。該區域主要存放8中基本型別(byte,short,int,boolean,long,double,char,long)和物件引用。
如 int a=1;String str="Hello World"; C c =new C(); 存放在棧儲存中的有a,1,str,c。該儲存區域特點還有編譯器在編譯時就要確認其大小和生命週期。

3.堆儲存
該儲存區域也位於RAM中,編譯時不需要指定其大小,程式碼執行時自動分配大小。該區域主要存放new 出來的物件。如C c=new C(),如上文所述c存放在棧儲存中,new C()存放在堆儲存中。堆儲存空間分配和回收,由JVM自動執行。

4.常量池
該儲存區域也位於RAM中,主要儲存在程式整個生命週期的值,如String,static final 關鍵字修飾的變數值。需要說明一下String變數,String不是基本資料型別,在程式中使用率很高。為了提供重用性、節約記憶體空間,JVM會將所有的字串存放在常量池中,如果使用字元在常量池已存在直接返回這個應用自動,不需要重複建立。

如:
String s1="abc";String s2 ="bcd";String s3="abc"; 常量池中只有兩個內容"abc","bcd".

引申:
如下下述程式碼,我們知道輸出值為false.

        String a=new String("Hello World");
        String b=new String("Hello World");
        System.out.println(a==b);複製程式碼

如果程式碼如下呢?輸出值為true.

        String a="Hello World";
        String b="Hello World";
        System.out.println(a==b);複製程式碼

5.非RAM儲存區域
該區域不在RAM中,如File檔案等。

案例分析:

1.如下程式碼,畫出資料儲存結構

    public class number {
        final static int i1 =1;
        int i2=2;
        int i3=2;
        String str1= "abc";
        String str2= "abc";
        String str3= "abc";
        String str4= new String("abc");
        String str5= new String("abc");
    }複製程式碼

儲存結構圖如下:

圖片
圖片

2.如下程式碼,String共申請幾份空間

    public class number {
        String str1= "Hello";
        String str2=" World";
        String str3=" !";
        String str4=str1 + str2 +str3; 
    }複製程式碼

共申請了5份空間,分別是"Hello","World","!","Hello World","Hello World !"

引申:該問題也解釋了字串拼接推薦使用StringBuffer或者StringBuilder

參考資料

[1] www.cnblogs.com/hzdtf/artic…

相關文章