2013-03-20 37 views
-1

在Java中,爲什麼這個額外的數組不消耗Java中的內存?

int n = 100000; 
int[] array = new int[n + n/2]; 
int[] arrayzip = new int[n]; 
System.arraycopy(array, 0, arrayzip, 0, n); 
hashmap.put(x, arrayzip); 

int n = 100000; 
int[] array = new int[n + n/2]; 
hashmap.put(x, new int[n]); 
System.arraycopy(array, 0, hashmap.get(x), 0, n); 

採取相同的內存量?在第一個代碼示例中創建了一個額外的數組。

[編輯]好了,現在第二個問題:

for (int i = 0; i < 100; i++) { 
    int n = 100000; 
    int[] array = new int[n + n/2]; 
    int[] arrayzip = new int[n]; 
    System.arraycopy(array, 0, arrayzip, 0, n); 
    hashmap.put(x, arrayzip); 
} 

如果我們把代碼的任何樣本循環內,然後arrayzip創建100次,然後所有100引用由於不見了被限制在一個循環中。 Aaa,現在我明白了,因此在堆上創建對象new int[],但它們不會丟失(垃圾收集),因爲它們將它們的引用存儲在超出範圍的對象hashmap中。很酷,我明白!

回答

10

沒有,兩個樣本創建相同數量的陣列 - 2.它們都包含以下數組創建表達式:

new int[n + n/2] 
new int[n] 

你在哪裏想到是創建另一個數組?或者,如果你不是發現在第二種情況下,數組創建表達式,此語句中:

hashmap.put(x, new int[n]); 

,在第一個版本引用其中的一個被分配到一個局部變量的事實使得中沒有差異多少個對象被創建的條款。

(我個人大大傾向於第一種碼在第二,順便說一句,這是更簡單易懂,IMO)

+0

所以'hashmap.put(X,arrayzip)'門店參考'arrayzip'並且不會生成(它被稱爲深?)它的副本(通過值傳遞)? – 2013-03-20 19:43:36

+4

@SophieSperner:是的。在Java *中,所有*參數都是按值傳遞的 - 但每個值只是一個原語或引用,而不是一個對象。這不是真的關於數組 - 它是通過參數傳遞和類型系統。它絕對值得確保你理解這種工作方式 - 如果你正在從一本書中學習Java,請仔細閱讀該部分。 – 2013-03-20 19:45:28