Java中大型列表的最佳列表实现是什么

2022-09-03 18:22:24

我必须创建一个包含n个元素的大型列表(最多可达100,000个)。列表中的每个元素都是一个整数,等效于列表的索引。在此之后,我必须在此列表中调用Collesions.shuffle。我的问题是,应该使用哪个列表实现(java集合或apache集合)。我的直觉是ArrayList可以在这里使用。所有的想法都值得赞赏。谢谢!

感谢您的输入。我想我坚持使用ArrayList。我目前正在使用具有初始容量参数的ArrayList构造函数,并且我传递了列表的大小。因此,如果原始列表是100000,我使用新的ArrayList(100000)创建这个新列表;因此,我认为我没有创建数组并执行asList,因为不会有任何大小调整。此外,大多数apache集合列表(如GrowthList和LazyList)都没有实现RandomAccess。这肯定会减慢洗牌的速度(根据javadocs)。FastArrayList确实实现了RandomAccess,但apache为这个类做了一个注释,说“这个类不是跨平台的。使用它可能会导致某些体系结构出现意外故障”。


答案 1

ArrayList 很可能每个列表元素的开销最小,因此应该是最佳选择。如果您经常需要删除列表中间的项目,这可能是一个更糟糕的选择。


答案 2

引自 Collections.shuffle javadoc:

此方法在线性时间中运行。如果指定的列表未实现 RandomAccess 接口并且很大,则此实现会在对指定的列表进行洗牌之前将其转储到数组中,并将洗牌的数组转储回列表中。这避免了因将“顺序访问”列表洗牌到位而导致的二次行为。

因此,如果您没有其他需求,我会使用实现RandomAccess的ArrayList。