我需要一个原始类型的集合/数组(double)。java原始数组vs vs实现
应用程序启动过程中,我将元素添加到列表/阵列只有一次。在程序运行期间,元素永远不会被删除。我知道我不会遍历整个数组,只能通过索引访问元素。我也不需要并发。
什么会更加记忆友好并且有更好的表现 - 原始数组还是ArrayList
/ArrayDeque
/...?
我需要一个原始类型的集合/数组(double)。java原始数组vs vs实现
应用程序启动过程中,我将元素添加到列表/阵列只有一次。在程序运行期间,元素永远不会被删除。我知道我不会遍历整个数组,只能通过索引访问元素。我也不需要并发。
什么会更加记忆友好并且有更好的表现 - 原始数组还是ArrayList
/ArrayDeque
/...?
如果你事先知道你的结构所需要的尺寸(和大小是固定的),基本类型数组,将提供最佳性能。原始数据类型因性能原因而存在,因此使用double
的数组比使用Double
(收集的double
s)的集合更快。
除了基元与对象问题之外,假设您使用正确的初始容量对其进行初始化,则ArrayList(由数组支持并且支持随机访问)将具有与数组类似的性能必须调整大小(如果情况并非如此,则无论如何都不能使用数组)。
使用数组,如果你有固定的大小和你想获得通过指数elemnt将是有利的。
而且它具有的优势越来越contigous内存分配的,所以后来GC不必须做压实的辛勤工作为将在数据库的情况下(ArrayList的除外)。
如果是开放的使用第三方库,你可以考虑使用一个不变的原始采集,即使你不需要并发。它几乎和内存一样高效,并且像原始数组一样高性能。您可以在应用程序启动时使用可变数据结构构建数据,然后在加载所有数据后将其转换为不可变数据结构。 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集合使用。相同的模式(启动时的可变构建 - >不可变)可以用于对象和原始集合。
注:我的Eclipse集合的参与者。