如何正确地在Java中删除一个数组

23 浏览
0 Comments

如何正确地在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日
0
0 Comments

在数组超出作用域后的某个时刻,如果没有其他引用,垃圾回收器将收回内存。

如果你想在变量超出作用域之前将引用设置为null(请记住,如果其他代码具有这个引用,它就不会被垃圾收集):

Foo[][] fooArray = new Foo[2][3];
...
// this will null the reference to the array
fooArray = null;

0
0 Comments

解释

在Java中,你不能显式地删除某些东西。这是垃圾收集器的工作。它会删除任何一个没有被任何人使用的东西。所以,要么

  1. 让变量超出作用域
  2. 将其分配给null
  3. 或为其分配任何其他实例。

那么数组实例(以及其子数组)就已经不再被引用,垃圾收集器最终会删除它们。


参考资料

为了理解为什么重新分配外部数组就足以删除内部数组,你需要理解它们是如何被引用的。同样,垃圾收集器可以删除任何无法访问的东西。因此,让我们来看一个数组:

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标签,不需要翻译)

0