【发布时间】:2010-11-25 22:09:26
【问题描述】:
有谁知道List 实现具有恒定时间get(int index)(即实现RandomAccess),但当它像ArrayList 一样增长时不必复制整个列表?
我认为实现很可能是根据其他列表,例如
public class ChunkedList<T> implements List<T>, RandomAccess {
private LinkedList<ArrayList<T>> chunks;
public T get(int index) {
return findCorrectChunk(index).get(computeChunkIndex(index));
}
}
【问题讨论】:
-
那么,您有一个列表,您需要定期扩展列表并按索引从中取出元素?
-
AFAIK,当超过当前容量时,ArrayList 的容量会翻倍。因此将有 O(log(n)) 个副本,其中 n 是列表的最终容量。这意味着需要复制整个列表的实际次数确实非常非常少。您可能会在开销变得很大之前很久就开始耗尽内存。 OTOH,如果您必须停止复制并提前知道列表必须保存的元素数量的上限,您可以简单地将最大大小作为参数传递给 ArrayList 的构造函数。
-
您需要这个有实际原因吗?有一个基准/配置文件显示 arraylist 是你的瓶颈吗?
-
实际原因是应用程序其他部分的设计非常糟糕。但是,用例是:将 ~1M 字符串添加到列表中,然后通过索引重复查找。 (1M 提前未知 - 取决于数据集)
-
对于 1M 条目,假设每次容量翻倍,将有
标签: java algorithm arrays list