哪个Java集合允许廉价追加?

cev*_*ing 6 java list

我在Java中搜索列表数据结构,允许廉价附加长列表.我尝试使用LinkedList,但我在addAll的文档中发现,迭代器用于附加两个列表.这意味着在操作期间克隆了附加的列表.迭代器遍历整个列表返回每个元素.是否有任何可用的集合在附加两个列表时省略了迭代?

Roh*_*ain 6

您可以使用Guava的 Iterables.concat方法来创建连接的Iterable视图.

Iterable<T> combined = Iterables.concat(list1, list2);
Run Code Online (Sandbox Code Playgroud)
  • 不会将元素从一个列表复制到另一个列表.
  • 所以,它不会改变你的任何列表..
  • 此外,这不会创建新列表(它创建一个Iterable不是列表)

基本上它创建了一个Iterable通过它可以迭代迭代two列表(它迭代list1中的元素然后从list2迭代).

注意: - 如果你想要一个列表作为连接two lists,那么这可能对你没什么帮助..因为,它不会创建一个列表,而是一个Iterable ..对于这种情况,除了Iterating列表之外别无选择以及copy你的每个参考..

来自文档: -

它将两个迭代组合成一个可迭代的.返回的iterable有一个遍历a中元素的迭代器,后跟b中的元素.直到需要时才会轮询源迭代器.返回的iterable的迭代器在相应的输入迭代器支持时支持remove().

你也有这个方法的一个var-args版本 .. 看文件 ..这可以采取任意数量的列表,并返回可以按顺序迭代这些列表的Iterables ..所以,你可以这样做..

Iterable<T> combined = Iterables.concat(list1, list2, list3, list4, ...);
Run Code Online (Sandbox Code Playgroud)

此链接 - > google-guava-libraries-essentials也可能对您感兴趣..

  • 是否真的有必要使用番石榴?我觉得奇怪的是Java的标准库没有提供这么简单的功能.甚至[Glib](http://developer.gnome.org/glib/stable/glib-Singly-Linked-Lists.html#g-slist-concat)也有它. (2认同)

Tud*_*dor 5

事实并非如此,因为所有"附加"操作都不会对底层集合做出任何假设.从技术上讲,可以直接附加两个链表,但附加必须是通用的,因此它使用迭代.

不允许直接连接的另一个好理由是,在追加更改后,一个列表也会影响另一个列表,我确信这不是一个理想的属性.