Java原始数组 vs List实现

3

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

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

基于内存友好和更好的性能考虑,哪种方式更优-原始数组或ArrayList/ArrayDeque/...?

3个回答

4
如果您事先知道结构所需的大小(且该大小固定),原始数组将提供最佳性能。原始数据类型存在是为了提高性能,因此使用 double 数组比使用 Double 的集合(装箱的 double)更快。
除了基本类型 vs. 对象问题之外,如果您使用正确的初始容量初始化 ArrayList(由数组支持并支持随机访问),并且它永远不必调整大小(如果不是这种情况,则无论如何都不能使用数组),它将提供与数组类似的性能。

1

如果您有固定大小并且想要按索引获取元素,则使用数组会很有优势。

此外,它具有获得连续内存分配的优点,因此后来的GC不必像在Collections中那样进行压缩的艰苦工作(除了ArrayList)。


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 中使用这种模式。同样的模式(可变构建 -> 不可变)可以用于对象和原始集合。
注意:我是 Eclipse Collections 的提交者。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接