如何正确地在Java中删除一个数组
如何正确地在Java中删除一个数组
这个问题已经在这里有了答案:
我才学Java四天,从我搜到的教程来看,讲师们花了很多努力来解释如何分配一个二维数组(例如):
Foo[][] fooArray = new Foo[2][3];
…但我没有找到任何解释如何删除它们的文章。
从内存的角度来看,变量fooArray
将指向堆中的一个内存块,其中有两个元素。每个元素也指向堆中的另一个内存块,其中有三个元素。
也就是说,我只需引用第一个元素块,垃圾回收器就会完成任务吗?
Foo[1] = null;
和Foo[2] = null;
还是说我必须将每个实例化的Foo元素设为空值?
Foo[1][1] = null;
Foo[1][2] = null;
Foo[1][3] = null;
...
admin 更改状态以发布 2023年5月21日
解释
在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}
(该内容为HTML标签,不需要翻译)