java原始数组vs List实现

时间:2014-11-01 11:57:39

标签: java arrays list primitive-types

我需要一个原始类型的集合/数组(double)。

我将在应用启动期间仅向列表/数组添加一次元素。在程序运行期间永远不会删除元素。我知道我永远不必迭代整个数组,只能通过索引访问元素。我也不需要并发。

什么会更友好,性能更好 - 原始数组或ArrayList / ArrayDeque / ...?

3 个答案:

答案 0 :(得分:4)

如果您事先知道所需的结构大小(并且该大小是固定的),则原始数组将提供最佳性能。由于性能原因,存在原始数据类型,因此使用double数组比Double的集合(框double s)更快。

除了基元与对象问题之外,ArrayList(由数组支持并支持随机访问)将给出与数组类似的性能,假设您使用正确的初始容量初始化它,并且它从未有过要调整大小(如果情况并非如此,那么无论如何都不能使用数组。)

答案 1 :(得分:1)

如果你有固定的大小并且你想通过索引获得elemnt,那么使用数组将是有利的。

此外它还具有获得连续内存分配的优势,因此后来GC不必像集合中那样进行压缩工作(ArrayList除外)。

答案 2 :(得分:1)

如果可以使用第三方库,即使您不需要并发,也可以考虑使用不可变的原始集合。它几乎与原始数组一样具有内存效率和性能。您可以在应用程序启动时使用可变数据结构构建数据,然后在加载所有数据后将其转换为不可变数据结构。 Eclipse Collections有一组可以使用的可变和不可变的原始数据结构。这是一个示例,显示构建10K随机双精度的可变列表,然后将MutableDoubleList转换为ImmutableDoubleList。这将具有修剪集合以及使其不可变的效果。

Random random = new Random();
MutableDoubleList list =
        random.doubles(10000, 0.0, 100.0)
                .collect(
                        DoubleLists.mutable::empty, 
                        MutableDoubleList::add, 
                        MutableDoubleList::addAll);

ImmutableDoubleList immutableDoubleList = list.toImmutable();
Assert.assertEquals(10000, immutableDoubleList.size());
System.out.println(immutableDoubleList.count(d -> d > 80.0d));
System.out.println(immutableDoubleList.get(0));
System.out.println(immutableDoubleList.get(99));
System.out.println(immutableDoubleList.get(999));
System.out.println(immutableDoubleList.get(9999));

我已经看到这种模式经常用于Eclipse Collections。相同的模式(启动时的可变构建 - > immutable)可以与对象和原始集合一起使用。

注意:我是Eclipse Collections的提交者。