Java 如何在二维阵列中释放内存

Java 如何在二维阵列中释放内存,java,arrays,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],但我面临内

我有很长的代码。但逻辑如下: 我有一个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;  
                      } 

为行中的每个引用设置
null

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

数组
新整数[arr.length]
包含
null

Java没有2D数组。它们由元素为数组的数组模拟

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

arr[0]=null;
请注意,这将适用于基元类型数组和对象数组。你不需要一个循环

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

// Assuming arr is int[][]
private static final int[] EMPTY_ROW = {};
...
arr[0] = EMPTY_ROW;
使用空数组,您可以避免添加空检查,并通常使用更简单的代码,同时获得与
null
相同的效果:删除对第一行的引用,使其符合垃圾收集的条件


如果您对设计模式感兴趣,只需编写一些代码并与其他人共享问题,就可以将其视为。

的应用程序!我们不可能像在c中那样释放内存。将该值赋值为null有助于gc知道该值已准备好释放。System.gc()告诉gc进行一些清理,但gc何时开始工作是未知的。粘贴它太长且不方便,因为它背后的逻辑也相当复杂,会使事情变得不清楚。最好只关注这个小问题。如果数组的数据类型是Object,则需要使用引用-based@user251414你能澄清一下吗,我不明白重点。如果数组索引处的对象仍在其他地方引用,GC可能不一定会释放内存!如果数组是基元,这是不可能的guy@Ilya你的答案很好。但是,我又被卡住了,因为我有一个非常非常大的数组。使用循环删除它花费了不可行的时间。有没有什么方法可以一次释放二维数组中的一整列而不进行循环?@user2192774您可以逐行加载数组而不是整个数组吗?@user2192774用于删除或初始化数组您需要初始化每个项目,如果您的数组真的很大,您可以使用GPU在几秒钟内完成初始化过程,或者甚至是多线程方法如何将原语设置为null真的?!我认为这不是空安全的
arr[0][?]
将抛出
NPE
@user251414他说数组应该设置为null。您可以将
int[]
设置为null,因为数组是一个对象,即使内容是基本体。@Joni。请检查我的更新。它是二维阵列。如何
arr[0]=null可以吗?但这对我不起作用。Java返回了错误,因为
null
。如果出现null指针异常,这意味着您试图使用第一行,即使您说已经使用完它。您的代码中有一个bug。
arr[0]=null;
// Assuming arr is int[][]
private static final int[] EMPTY_ROW = {};
...
arr[0] = EMPTY_ROW;