Java集合仅针对添加(插入)操作进行了优化

时间:2018-08-06 13:36:02

标签: java list arraylist collections linked-list

我正在寻找Java集合。我唯一的两个期望是:

  1. 快速O(1)插入/添加操作。

  2. 迭代此集合的能力。

我不在乎元素顺序。

  • LinkedList并不是最佳的候选者,因为有许多小的分配(对于每个新节点)。
  • ArrayList不是最佳的候选者,因为在没有剩余空间的情况下,内部数组会调整大小。

您可以提出针对此类操作优化的其他Java集合吗?

换句话说,我正在寻找LinkedListArrayList之间的混合体。像LinkedList之类的东西,其中的附加内存分配是为N个下一个元素预先分配的,而不是像LinkedList这样的每个新元素。

3 个答案:

答案 0 :(得分:2)

由于您非常在意内存分配,因此请不要使用ArrayListLinkedList,而要使用简单的数组,该数组易于操作和存储大数据。

用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),并且可以使用迭代器进行迭代。