解释
您不能在 Java 中显式删除某些内容。垃圾回收器的工作就是要做到这一点。它将删除任何人不再使用的任何内容。因此,要么
- 让变量超出范围或
- 分配
null
- 或任何其他实例。
然后,数组实例(及其子数组)将不再被引用,垃圾回收器最终将删除它。
引用
要了解为什么重新分配外部数组就足以删除内部数组,您需要了解它们是如何被引用的。同样,垃圾回收器可以删除任何无法访问的内容。因此,让我们看一下数组,例如:
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}