解释
在 Java 中你不能显式地删除某些东西。这是垃圾收集器的工作。它将删除任何人不再使用的任何内容。所以要么
- 让变量超出范围或
- assign
null
- 或任何其他实例。
那么数组实例(及其子数组)是不再引用垃圾收集器最终会删除它。
参考
要理解为什么重新分配外部数组就足以删除内部数组,您需要了解它们是如何引用的。同样,垃圾收集器可以删除任何无法到达的 https://docs.oracle.com/javase/specs/jls/se11/html/jls-12.html#jls-12.6.1。那么让我们看一下一个数组,例如:
int[][] outer = {{1, 2}, {3, 4}, {5, 6}};
我们有 4 个数组实例。一种是类型int[][]
和三个类型int[]
。另外,我们还有一个变量outer
。实例引用如下:
___> {1, 2}
|
outer --> int[][] ---|---> {3, 4}
|
|___> {5, 6}
所以通过删除outer
,没有人参考int[][]
不再了。垃圾收集器现在可以删除它。但这也删除了对内部数组的所有引用,因此垃圾收集器现在也可以删除它们。
现在假设您将通过另一个变量引用内部数组之一:
int[][] outer = {{1, 2}, {3, 4}, {5, 6}};
int[] thirdInner = outer[2];
other = null; // remove the reference
现在的情况是
outer --> null
___> {1, 2}
|
int[][] ---|---> {3, 4}
|
|______> {5, 6}
|
thirdInner _______________|
所以垃圾收集器现在将删除外部数组int[][]
,这还会删除对第一个和第二个内部数组的所有引用。但第三个仍然被引用thirdInner
,所以在垃圾收集之后我们有:
outer --> null
thirdInner --> {5, 6}