Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正在复制数组或在ArrayList上强制设置初始大小。什么更有效率?_Java_Arrays_Arraylist - Fatal编程技术网

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)