Java中記憶體分析:
棧(Stack) :存放基本類型的變數資料和對象的
引用,但對象本身不存放在棧中,而是存放在堆(new 出來的對象)或者常量池中(字串常量對象存放在常量池中)。 堆(heap):存放所有new出來的對象。 常量池(constant pool):在堆中分配出來的一Block Storage地區,存放儲顯式的String常量和基本類型常量(float、int等)。另外,可以儲存不經常改變的東西(public static final)。常量池中的資料可以共用。 靜態儲存:存放靜態成員(static定義的)。
1)
String a = "abc";①
String b = "abc";②
分析:
①代碼執行後在常量池(constant pool)中建立了一個值為abc的String對象,②執行時,因為常量池中存在"abc"所以就不再建立新的String對象了。 2)
String c = new String("xyz");①
String d = new String("xyz");② 分析:①Class被載入時,"xyz"被作為常量讀入,在常量池(constant pool)裡建立了一個共用的值為"xyz"的String對象;然後當調用到new String("xyz")的時候,會在堆(heap)裡建立這個new String("xyz")對象;②由於常量池(constant pool)中存在"xyz"所以不再建立"xyz",然後建立新的new String("xyz")。
3)
String s1 = new String("xyz"); //建立二個對象(常量池和棧中),一個引用
String s2 = new String("xyz"); //建立一個對象(棧中),並且以後每執行一次建立一個對象,一個引用
String s3 = "xyz"; //建立一個對象(常量池中),一個引用
String s4 = "xyz"; //不建立對象(共用上次常量池中的資料),只是建立一個新的引用4)
public class TestStr {
public static void main(String[] args) {
// 以下兩條語句建立了1個對象。"鳳山"儲存在字串常量池中
String str1 = "鳳山";
String str2 = "鳳山";
System.out.println(str1==str2);//true
//以下兩條語句建立了3個對象。"天峨",儲存在字串常量池中,兩個new String()Object Storage Service在堆記憶體中
String str3 = new String("天峨");
String str4 = new String("天峨");
System.out.println(str3==str4);//false
//以下兩條語句建立了1個對象。9是儲存在棧記憶體中
int i = 9;
int j = 9;
System.out.println(i==j);//true
//由於沒有了裝箱,以下兩條語句建立了2個對象。兩個1Object Storage Service在堆記憶體中
Integer l1 = new Integer(1);
Integer k1 = new Integer(1);
System.out.println(l1==k1);//false
//以下兩條語句建立了1個對象。1Object Storage Service在棧記憶體中。自動裝箱時對於值從127之間的值,使用一個執行個體。
Integer l = 20;//裝箱
Integer k = 20;//裝箱
System.out.println(l==k);//true
//以下兩條語句建立了2個對象。i1,i2變數儲存在棧記憶體中,兩個256Object Storage Service在堆記憶體中
Integer i1 = 256;
Integer i2 = 256;
System.out.println(i1==i2);//false
}
}