Java 正在复制数组或在ArrayList上强制设置初始大小。什么更有效率?
我试图创建一个可变的值列表(非编程意义上的列表)。列表将是预先指定的长度Java 正在复制数组或在ArrayList上强制设置初始大小。什么更有效率?,java,arrays,arraylist,Java,Arrays,Arraylist,我试图创建一个可变的值列表(非编程意义上的列表)。列表将是预先指定的长度n 我的第一个选择是使用一个初始化为n的数组。但是由于数组是不可变的,如果我想添加另一个值,我唯一的选择就是将数组复制到一个更大的数组中。我决定改用ArrayList 这样做的代价是我不能将ArrayList设置为初始大小n。但是,我可以将值添加到ArrayList,因为它是可变的。因此,我想知道创建一个数组,然后在需要时将其复制到一个更大的数组中,或者创建一个ArrayList并使用for循环“初始化”所有n值是否更有效
n
我的第一个选择是使用一个初始化为n
的数组。但是由于数组是不可变的,如果我想添加另一个值,我唯一的选择就是将数组复制到一个更大的数组中。我决定改用ArrayList
这样做的代价是我不能将ArrayList
设置为初始大小n
。但是,我可以将值添加到ArrayList
,因为它是可变的。因此,我想知道创建一个数组,然后在需要时将其复制到一个更大的数组中,或者创建一个ArrayList
并使用for循环“初始化”所有n
值是否更有效
用什么更好 看看
ArrayList
的实现,它完全按照您的建议执行。它只是在需要时创建一个更大的数组,并从小数组中复制所有条目
只要拷贝任务必须很少在不太大的阵列上执行,这是非常有效的。这就是为什么您应该始终尝试创建一个带有大小参数的ArrayList,该参数大约是您希望列表增长到的大小(或稍大一点)。通过这种方式,您可以最小化(或者可能避免)用更大的阵列替换内部阵列以及所需的所有工作(阵列副本)
附加说明如果您的数据是元素数据类型,您可能希望避免装箱到包装器类型的开销(内存和速度)。在这种情况下,
ArrayList
不适合您,您可以为需要它的元素数据类型实现类似的机制,或者查看一下www.I.bed。类似的实现有很多
p.p.s如果您不确定不同方法的性能,最好同时实施并分析尽可能接近真实数据的测试数据的性能。您确定需要担心这种微观优化吗?如果您没有太多随机访问列表元素的机会,使用
LinkedList
。否则,ArrayList
只需使用具有初始容量的构造函数初始化ArrayList即可:List myList=new ArrayList(n)代码>