我正在寻找Java集合。我仅有的两个期望是:
-
快速
O(1)
插入/添加操作。 -
对这些集合进行迭代的能力。
我不在乎元素的顺序。
LinkedList
不是最佳候选者,因为(对于每个新节点(有许多小的分配ArrayList
不是最佳候选,因为当没有更多空间时内部阵列会调整大小
您能提出针对此类操作优化的其他Java集合吗?
换句话说,我正在寻找LinkedList
和ArrayList
之间的混合。类似于LinkedList
,其中额外的内存分配是为N个下一个元素预先分配的,而不是像LinkedList那样为每个新元素预先分配。
由于您非常关心内存分配,因此不要使用ArrayList
或LinkedList
,而是使用易于操作和存储大数据的简单数组。
分配具有例如1'000'000个元素的数组的大小:
MyClass[] array = new MyClass[1000000];
- 将对象分配给数组的索引也会花费
O(1)
- 使用
for-loop
进行迭代非常简单
如果希望执行其他操作,请使用for-loop
迭代。主要缺点是:
- 声明后固定大小
- 可以存储单个类型
此外,考虑Stream-API(值得尝试,我不知道这里的性能(:
Arrays.stream(array)...
在LinkedList中,您没有为列表分配新内存,只需对新元素进行引用即可。
LinkedList的工作方式类似于一个链,其中包含对链中上一个/下一个元素的引用。若并没有前面那个意思的元素,那个么这就是第一个元素。若并没有引用下一个元素,这意味着它是列表的最后一个元素。因此,添加新元素只是在"链"的末端创建引用。
它可以快速分配新元素,但如果你想访问,例如列表中的第10个元素,它需要在"链"->上迭代,这意味着它将访问从第一个到第10个的每个元素。与ArrayList相比,这是最大的缺点,在ArrayList中,到达具有指定索引的元素具有O(1(性能。(使用list.get(index(方法(
您有没有想过为java.util.Queue
使用队列?
它的插入时间复杂度为O(1(,并且可以使用迭代器进行迭代。