在Java中拥有一个巨大的ArrayList的最佳方法是什么?

时间:2014-08-11 22:19:31

标签: java list arraylist

我需要一个Java中的ArrayList,它可以有多达一百万个条目(我不会制定规则,我只是实现它们)。 ArrayList在100万之前显然会死得很好(它可能会到达那里,但它会花费很长时间)。 LinkedList不起作用,因为我需要使用get(index)来访问它。

最好的方法是什么?我所想到的最好的是一个两步数组,主阵列的元素指向数组的一个子集。因此每个数组包含1,000个对象,主数组可以指向1,000个这些子数组。

数组不稀疏,按顺序构建。然后大部分按顺序访问。

以下一些问题的更新:

  1. 我确实需要ArrayList(或等效的)来实现我需要的功能。
  2. 我确实需要一次在记忆中。
  3. 我不知道提前有多大。通常它将是4-20个元素。但在极少数情况下它可能是一百万。
  4. 我发现一旦数组获得超过120K的条目,它就会每隔30左右就会暂停一次。所以我假设增长一个ArrayList需要时间,因为它变大。
  5. 更新2:

    对于这种说法,ArrayList应该足够快,我写了一个小的测试例程,一次创建一个百万行数组一个add()。它是(我要挖掘我的代码,看看为什么这看起来像问题,因为它不是)。

    LinkedList seconds = 0.136

    ArrayList seconds = 0.087

2 个答案:

答案 0 :(得分:3)

给定数组A,索引的类型为integer,这意味着它可以有数百万个条目。因此,使用

的最简单的方法是拥有一个包含百万个O类型的数组
O[] o = new O[1000000];

答案 1 :(得分:3)

如果您所做的只是添加元素,按索引访问元素并按顺序迭代元素,为什么ArrayList会出现问题? ArrayList在所有这些操作中都非常有效。

如果您真的在谈论拥有一个比您可以支持的数组大得多的数组,那么您真正谈论的是数据库访问。如果您认为您的数组是一个数据库表,并且每个元素的索引都在整数列中表示,那么这很容易实现。

如果你不关心延迟,你可以在数据库中为该列创建一个索引,然后通过索引列进行选择,这是合理有效的(尽管不如访问内存中的引用那么快) 。如果您关心延迟并且可以预先预测您可能正在访问哪些元素,则可以轻松地使用某种缓存机制来满足您的内存和对象访问要求。

不幸的是,我不知道你的延迟要求是什么,你的问题并没有真正说明你将如何使用这个巨大的阵列,所以这个模糊的asspull是我能做的最好的。