减小数组的大小(通过创建一个新的数组) - arrayList如何做到这一点?

时间:2013-08-05 17:06:06

标签: java android arrays arraylist

在我的一个课程中,我有一个类似的方法:

public void setArray(int size){

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

}

现在,如果我打电话给这个并传入,比方说500,就像这样:

setArray(500);

然后,在我的应用程序中,我现在只需要一个带有50个元素的数组,我只需再次调用它并传入50作为我的论点。

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

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

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

3 个答案:

答案 0 :(得分:4)

您正在描述 dynamic array 的行为。

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

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

ArrayList的官方实现从不会减小数组的大小,只会在需要时增加容量。 当从ArrayList中删除元素时,它确保后元素返回一个位置并为右侧的自由元素设置null。