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