我有一个很长的代码。但逻辑如下:
我有一个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
答案 0 :(得分:6)
将null
设置为行
for (int i = 0; i < arr.length; i++)
{
arr[0][i] = null;
}
arr
应该是引用数组,而不是原始类型
修改强>
对于原始类型(例如int
),您可以使用包装类(例如java.lang.Integer
代替int
:Integer[][]
而不是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的应用。