如何在二维数组中释放内存

时间:2013-07-01 06:24:09

标签: java arrays

我有一个很长的代码。但逻辑如下: 我有一个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]但是我遇到了内存限制而我想从第一行释放内存[0][0], [0][1], [0][2]就像我一样不再需要它了。我只需要当前行和前一行进行比较。所以,每当我完成比较时,我想删除第一行。

更新: 我尝试将NULL分配给未使用的数组位置,如下所示:

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

我的数组是int类型,我只需要最后两列。一旦我向前移动一个位置,就不需要第一个。当我应用上面的代码来分配NULL时,我得到了:

java.lang.NullPointerException

2 个答案:

答案 0 :(得分:6)

null设置为行

中的每个引用
for (int i = 0; i < arr.length; i++)
{  
   arr[0][i] = null;  
} 

arr应该是引用数组,而不是原始类型

修改
对于原始类型(例如int),您可以使用包装类(例如java.lang.Integer代替intInteger[][]而不是int[][]

<强> EDIT2
前一个循环的等价是:

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

数组new Integer[arr.length]包含null个值

答案 1 :(得分: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的应用。