2014-11-01 68 views
1

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

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

什么会更加记忆友好并且有更好的表现 - 原始数组还是ArrayList/ArrayDeque/...?

回答

2

如果你事先知道你的结构所需要的尺寸(和大小是固定的),基本类型数组,将提供最佳性能。原始数据类型因性能原因而存在,因此使用double的数组比使用Double(收集的double s)的集合更快。

除了基元与对象问题之外,假设您使用正确的初始容量对其进行初始化,则ArrayList(由数组支持并且支持随机访问)将具有与数组类似的性能必须调整大小(如果情况并非如此,则无论如何都不能使用数组)。

1

使用数组,如果你有固定的大小和你想获得通过指数elemnt将是有利的。

而且它具有的优势越来越contigous内存分配的,所以后来GC不必须做压实的辛勤工作为将在数据库的情况下(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集合使用。相同的模式(启动时的可变构建 - >不可变)可以用于对象和原始集合。

注:我的Eclipse集合的参与者。