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