说明
在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}