2013-07-01 34 views
0

我有一個很長的代碼。但邏輯如下: 我有一個Java中的二維數組。所以,我的值位於內部位置:[0][0], [0][1], [0][2]和值:[1][0], [1][1], [1][2]。在這一點上,我做了一些比較,我從第一行開始。我想釋放內存:[0][0], [0][1], [0][2]並移至下一個位置[2][0], [2][1], [2][2]如何在二維陣列中釋放內存

我該怎麼做這樣的事情。我無法覆蓋[0][0], [0][1], [0][2],我的代碼已經編程爲移動到下一行,即[2][0], [2][1], [2][2],但我遇到了內存限制,我想從第一行釋放內存,因爲我不再需要它了。我只需要當前行和前一行進行比較。所以,我想在完成比較時刪除第一行。

更新: 我試圖分配NULL到未使用陣列的位置,如下所示:

for (int f = 0; f <= capacity; f++) 
         { 
         table[f][i-2] = (Integer) null; 
         } 

我的數組是int類型的,我只需要在最後兩列。一旦我再向前移動一個位置,就不需要第一個。當我應用上述代碼分配NULL,我得到:

java.lang.NullPointerException 
+2

只需編寫一些代碼並與他人分享問題! –

+0

像我們在c中做的那樣,釋放記憶是不可能的。將值分配給null有助於gc公佈該值已準備好釋放。 * System.gc()*告訴gc做一些乾淨的工作,但是當gc開始工作的時候是不知道的。 –

+0

粘貼它太長和不便,因爲它背後的邏輯也相當複雜,會使事情不清楚。最好只關注這個小問題。 – user2192774

回答

6

設置null每個參考行

for (int i = 0; i < arr.length; i++) 
{ 
    arr[0][i] = null; 
} 

arr應引用的數組,而不是原始類型

EDIT
對於原始類型(例如int),您可以使用包裝類(例如的代替int:的int[][]Integer[][]代替)

EDIT2
等效的先前循環爲:

arr[0] = new Integer[arr.length]; 

陣列new Integer[arr.length]包含null

+1

如果數組索引處的對象仍然在其他地方被引用,GC可能不一定釋放內存! – Sebastian

+0

@Sebastian是的,當然 – Ilya

+1

這是不可能的,如果該陣列是一個原始的傢伙 – 2013-07-01 06:37:40

4

Java沒有2D陣列。它們被元素是數組的數組模仿。

您可以將數組數組的第一個數組設置爲null;這允許GC收集它和它包含的所有內容。

arr[0]=null; 

請注意,這將適用於基元類型和對象兩個數組的數組。你不需要一個循環。

使用null一個替代方案是使用一個空數組:

// Assuming arr is int[][] 
private static final int[] EMPTY_ROW = {}; 
... 
arr[0] = EMPTY_ROW; 

使用一個空數組你可能能夠避免增加空檢查和使用簡單的代碼在一般情況下,而獲得相同的效果,與null:對第一行的引用被刪除,因此它有資格進行垃圾回收。

如果您對設計模式感興趣,可以將其視爲Null Object Pattern的應用程序。

+0

你如何將一個原子設置爲null? – 2013-07-01 06:36:22

+0

我認爲這不是'無效的'。 'arr [0] [?]'會拋出NPE' – Ilya

+0

@ user2511414他在說數組應該設置爲空。你可以設置一個int []爲空,因爲即使內容是基元,數組也是一個對象。 – Alderath