我的直觉告诉我数组比ArrayList更快,因为ArrayList是使用数组来实现的,而数组在填充/丢失元素时会调整大小。
我只是想确认这是否正确,即如果你知道要保存的元素数量,就没有理由使用ArrayList。
我的直觉告诉我数组比ArrayList更快,因为ArrayList是使用数组来实现的,而数组在填充/丢失元素时会调整大小。
我只是想确认这是否正确,即如果你知道要保存的元素数量,就没有理由使用ArrayList。
任何性能差异都将是微不足道的,特别是如果你使用 initialCapacity
初始化你的 ArrayList。 以最易读和易于维护的方式编写代码,并尽量避免优化这种东西,除非你经过测试确定它会对性能产生显著影响。
使用 ArrayList
的潜在原因:
contains
等)Iterable
、Collection
和 List
,因此可以在很多基于接口的 API 调用中使用。ArrayList的功能比原始数组更加强大。如果你知道元素数量,可以创建指定大小的ArrayList。
new ArrayList<String>(100);
正如其他人已经说过的那样,除非性能基准表明它是一个瓶颈,请使用ArrayList。
是的,由于访问开销,确实存在性能差异,但通常不会显着。唯一的例外是如果您在ArrayList中存储原始类型。这将导致重大的性能损失,因为它将对象转换为/从Object和原始类型。
// easier to work with but slow
ArrayList<Double> slowList;
// faster primitive data array
double[] fasterList;
ArrayList
在简单的get/set操作上并不比其他更快,但差异非常小,几乎在任何现实情况下都不值得担心。
List
API有一些方法可能会用到,即使在您已知大小将被固定的情况下也是如此。例如,考虑 contains()
。您还必须在需要 Iterator
或 API 需要 List
的情况下使用 ArrayList
-- 即使您知道列表大小是固定的。
是的,数组速度更快。如果您运行数值算法,您可以看到明显的加速。
然而,对于普通应用程序,您不必担心它。这是因为大多数运行时间都花在其他事情上。
不要过早地优化你的代码,而是使用最适合你代码的数据结构。
正如你所说的经验法则可能是:
我不知道元素的数量或者它经常变化 => 列表(不要固定实现)
元素的数量是固定的并且预先已知 => 数组
ArrayList
的函数,并且他想要切换,他必须更改使用该函数的代码,如果该代码返回该数组ArrayList
,他必须更改使用该代码的代码等等。 - Idan AryeArrayList
(如C++中的),也不能使用类型推断来隐藏这些细节(如D中的)。Java甚至没有typedef
或alias
来掩盖您实际使用的类型。 - Idan Arye数组比数组列表快得多。差异可能达到百分之几百,可能来自JVM优化。如果将数组变量声明为volatile,则可以获得类似的性能。