我正在寻找Java集合。我唯一的两个期望是:
快速O(1)
插入/添加操作。
迭代此集合的能力。
我不在乎元素顺序。
LinkedList
并不是最佳的候选者,因为有许多小的分配(对于每个新节点)。ArrayList
不是最佳的候选者,因为在没有剩余空间的情况下,内部数组会调整大小。您可以提出针对此类操作优化的其他Java集合吗?
换句话说,我正在寻找LinkedList
和ArrayList
之间的混合体。像LinkedList
之类的东西,其中的附加内存分配是为N个下一个元素预先分配的,而不是像LinkedList这样的每个新元素。
答案 0 :(得分:2)
由于您非常在意内存分配,因此请不要使用ArrayList
或LinkedList
,而要使用简单的数组,该数组易于操作和存储大数据。
用ex分配数组的大小。 1'000'000个元素:
MyClass[] array = new MyClass[1000000];
O(1)
。 for-loop
进行迭代很简单。如果您想执行其他操作,请使用for-loop
迭代。主要缺点是:
还要考虑Stream-API(值得尝试,我对这里的性能一无所知):
Arrays.stream(array)...
答案 1 :(得分:0)
在LinkedList中,您没有在列表中分配新的内存,只是对新元素进行了防御。
LinkedList的工作原理类似于链,其中包含对链中上一个/下一个元素的引用。 如果没有先前的元素意味着这是第一个元素。如果没有对下一个元素的引用,则表示它是列表的最后一个元素。 因此,添加新元素只是在“链”末尾创建引用。
它使分配新元素的速度非常快,但是,如果要访问列表中的第10个元素,则需要遍历“链”->,这意味着它将从第一个元素访问每个元素。一到十。 与ArrayList相比,这是最大的缺点,在ArrayList中到达具有指定索引的元素具有O(1)性能。 (使用list.get(index)方法)
答案 2 :(得分:0)
您是否考虑过将队列用于java.util.Queue
?
它的插入时间为O(1),并且可以使用迭代器进行迭代。