我需要一个原始类型的集合/数组(double)。
我将在应用启动期间仅向列表/数组添加一次元素。在程序运行期间永远不会删除元素。我知道我永远不必迭代整个数组,只能通过索引访问元素。我也不需要并发。
什么会更友好,性能更好 - 原始数组或ArrayList
/ ArrayDeque
/ ...?
答案 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的提交者。