Java 减少数组的大小(通过创建一个新的数组)——arrayList是如何做到的?

Java 减少数组的大小(通过创建一个新的数组)——arrayList是如何做到的?,java,android,arrays,arraylist,Java,Android,Arrays,Arraylist,在我的一个类中,我有这样一个方法: public void setArray(int size){ myArray = new int[size] //myArray is declared already } 现在,如果我打电话进来,比如说500 setArray(500); 然后,稍后在我的应用程序中,我只需要一个数组,比如说50个元素,现在,我只需再次调用它并传入50作为我的参数 这个数组在我的应用程序中被引用了很多次,我想知道CG是否会收集旧的数组 我知道我真的应该使用arra

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

public void setArray(int size){

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

}
现在,如果我打电话进来,比如说500

setArray(500);
然后,稍后在我的应用程序中,我只需要一个数组,比如说50个元素,现在,我只需再次调用它并传入50作为我的参数

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

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


arrayList是如何做到“幕后”的?我可以模仿arrayList的行为吗?它只是像我所做的那样创建一个新数组吗?

您正在描述一个的行为

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


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

您正在描述的是的行为

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


如果您想知道它是如何在java中实现的,以及正在进行哪些优化,您可能需要查看。

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

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

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


顺便说一句,您是对的,只要没有引用旧数组的变量,旧数组就会被垃圾收集。这在某种程度上取决于代码的工作方式。如果您显示的代码和定义是唯一的参考,那么当您创建新数组并存储它时,它将被GC’ed。

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

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

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


顺便说一句,您是对的,只要没有引用旧数组的变量,旧数组就会被垃圾收集。这在某种程度上取决于代码的工作方式。如果您显示的代码和定义是唯一的参考,那么当您创建一个新数组并存储它时,它将被GC’ed。

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

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

查看。你可能还想阅读更多关于一般的内容。我绝对建议你阅读我的教程。简言之,为了扩大后备阵列,您需要使用方法ensureCapacity。但是,为了消除尾部的空桶,您可以使用trimToSize方法查看。你可能还想阅读更多关于一般的内容。我绝对建议你阅读我的教程。简言之,为了扩大后备阵列,您需要使用方法ensureCapacity。但是为了消除尾部的空桶,你可以使用trimToSize方法谢谢@Lee Meador-我对这种情况下的GC行为有一个问题,但我会把它放到另一个问题中-干杯。谢谢@Lee Meador-我对这种情况下的GC行为有一个问题,但我会把它放到另一个问题中-干杯。