0

我有一个很长的代码。但逻辑如下:我在 Java 中有一个二维数组。所以,我在 locations: 中有值[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
4

2 回答 2

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

于 2013-07-01T06:25:11.693 回答
4

Java 没有二维数组。它们被元素为数组的数组所模仿。

您可以将数组数组的第一个数组设置为null;这允许 GC 收集它以及它包含的所有内容。

arr[0]=null;

请注意,这将适用于原始类型数组和对象数组的数组。你不需要循环。

使用的替代方法null是使用空数组:

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

使用空数组可以避免添加空检查并使用更简单的代码,同时获得与使用相同的效果null:删除对第一行的引用,因此它可以进行垃圾回收。

如果你对设计模式感兴趣,这可以被认为是Null Object Pattern的一个应用。

于 2013-07-01T06:29:08.707 回答