0

在我的一个课程中,我有一个这样的方法:

public void setArray(int size){

myArray = new int[size]  //myArray is declared already

}

现在,如果我调用它并传入,比如 500,如下所示:

setArray(500);

然后,稍后在我的应用程序中,我只需要一个包含 50 个元素的数组,此时,我只需再次调用它并传入 50 作为我的参数。

这个数组在我的应用程序中被多次引用,我想知道 CG 是否会收集旧的?

我知道我真的应该使用 arrayList,不幸的是,这将是一项重大任务,因为我的代码现在有数千行和 18 个类(所以我想我已经为我的下一个项目学习了!)

arrayList 如何在“幕后”实现这一目标?我可以模仿 arrayList 的行为吗?它只是像我一样创建一个新数组吗?

4

3 回答 3

4

您正在描述动态数组的行为。

实现此数据结构的最简单方法是在数组已满或低于某个阈值(例如,仅占用 1/4 的单元格)时创建一个新数组,并将现有值复制到新数组中。

如果您想知道它是如何在 java 中完成的,以及正在进行哪些优化 - 您可能想看看ArrayListclass source

于 2013-08-05T17:13:33.473 回答
1

您可以在此处阅读 ArrayList 的源代码:SOURCE

你是对的,它保留一个数组并根据需要替换它,以便为更多对象留出空间。但它也存储长度,因此数组可以比需要的长。这允许 ArrayList 增长一点,而不必每次都重新创建实际的数组。如果 ArrayList 变小,则不必重新创建。它只是更改存储的长度。

您可以阅读代码以了解他们如何决定何时更改数组本身。每当他们这样做时,他们都必须复制旧的内容。

顺便说一句,你是对的,只要没有引用它们的变量,旧数组就会被垃圾收集。这有点取决于你的代码是如何工作的。如果您显示该代码并且定义是唯一的参考,那么当您创建一个新数组并存储它时,它将被 GC'ed。

于 2013-08-05T17:14:12.637 回答
0

ArrayList 的官方实现从不减少数组的大小,只在需要时增加容量。当从 ArrayList 中移除一个元素时,它确保后面的元素返回一个位置,并将右边的空闲元素设置为 null。

于 2013-08-05T17:52:43.483 回答