Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';在Java中拥有一个巨大的ArrayList的最佳方式是什么?_Java_List_Arraylist - Fatal编程技术网

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

什么';在Java中拥有一个巨大的ArrayList的最佳方式是什么?,java,list,arraylist,Java,List,Arraylist,我需要一个Java中的ArrayList,它最多可以有一百万个条目(我不制定规则,我只是实现它们)。ArrayList显然会在100万美元之前死亡(它可能会到达那里,但需要很长时间)。LinkedList不起作用,因为有些地方我需要使用get(index)访问它 最好的方法是什么?我想到的最好的方法是两步数组,其中主数组的元素指向数组的子集。因此,每个数组包含1000个对象,主数组可以指向其中的1000个子数组 阵列不是稀疏的,而是按顺序构建的。然后大部分按顺序访问 以下部分问题的更新: 我确实

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

最好的方法是什么?我想到的最好的方法是两步数组,其中主数组的元素指向数组的子集。因此,每个数组包含1000个对象,主数组可以指向其中的1000个子数组

阵列不是稀疏的,而是按顺序构建的。然后大部分按顺序访问

以下部分问题的更新:

  • 我确实需要ArrayList(或等效的)来实现我需要的功能
  • 我确实需要一次把它全部记在记忆里
  • 我不知道事先会有多大。通常是4-20个元素。但在极少数情况下,它可能是一百万
  • 我发现,一旦数组获得超过120K个条目,它大约每增加30个条目就会暂停一次。因此,我假设随着ArrayList变得越来越大,它的成长需要时间
  • 更新2:

    有人回答说ArrayList应该足够快,我编写了一个小测试例程,一次创建一个百万行数组add()。它是(必须深入研究我的代码,看看为什么它看起来像问题,因为它不是)

    LinkedList秒数=0.136


    ArrayList seconds=0.087

    给定一个数组A,索引的类型为
    integer
    ,这意味着它可以有几百万个条目。因此,让一个数组中有一百万个O型条目的最简单方法是使用

    O[] o = new O[1000000];
    

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

    如果您真正谈论的是拥有一个比您所能支持的大得多的阵列,heapwise,那么您真正谈论的是数据库访问。如果将数组看作是一个数据库表,每个元素的索引都表示在一个整数列中,那么这很容易实现

    如果您不关心延迟,您可以在数据库中为该列创建一个索引,并按索引列进行选择,这是相当有效的(尽管显然没有访问内存中的引用那么快)。如果您关心延迟,并且可以预先预测您可能要访问哪些元素,那么可以很容易地创建某种缓存机制来满足您的内存和对象访问需求


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

    使用嵌入式数据库或外部缓存。“最佳”取决于您的要求。你的记忆力够吗?你有足够的磁盘空间吗?如果由于内存限制而需要放弃某些条目,那么这些条目是否可以轻松地重新计算?你是需要一次完成整个阵列,还是只需要一个interator就足够了?看看这个为什么
    ArrayList
    会死掉?如果你有堆空间,你可以很容易地调用和获取你的数组。“数组”是指“列表”还是“类似列表的结构?”Java中的数组是一种特殊的东西,在Java中只有一种方法可以创建一个可以容纳一百万条目的数组:
    newwhich[1000000]
    。如果这不是你的意思,你需要更具体地说明你的意思。不幸的是,我不知道提前有多少条。我需要在得到它们时添加它们。可能是1。通常是4-20。但也可能是1000000。那么你的标题就不准确了。你需要一个列表。我不想限制解决方案,但我改变了它,因为这确实让一些人不清楚。最大的问题是我事先不知道大小,否则一个普通的旧数组将是完美的。请注意,当超过这个数组时,您可以创建一个新的更大的数组(并手动跟踪最后一个索引)并复制内容。存在有效的复制方法。换句话说,显式地执行数组列表所做的事情。是的,所有这些都需要在内存中。我发现ArrayList的增长速度超过120K,大约每增加30个左右就需要时间。所以我认为这是一个打击,因为它变得足够大,可以调整大小。这可能是其他东西,如垃圾收集。arraylist按指数而非线性调整大小是否可以预先分配数组?它创建一个新数组,并在每次超出当前容量时复制引用。即便如此,这也是一种有效的操作。另外,java将数组的大小增加了当前大小的一个百分比(不记得增加了多少,但这是一个很大的百分比),而且在任何情况下,对于一个大小为n的数组,只有日志(n)重新分配,而不管每次重新分配的大小增加了多少百分比。