将两个链接列表放在一起而不复制 - Java,使用标准API

Vic*_*tor 8 java performance

我的代码中有两个LinkedList,我需要创建一个包含两个的.我将不再需要这个列表,只需要新的列表,它包含我需要的所有数据.

我可以使用.addAll(),但性能是一个巨大的问题,我不能等待复制,添加引用,每次都...

如果我们创建自己的链表,我正在寻找像往常一样的东西,只需将最后一个节点从一个连接到第二个节点.有没有办法使用java api中的LinkedList类?


合并集合是一个不同的情况,虽然操作意味着几乎相同,但我的问题仅仅是关于性能和链接列表,通常可以做我需要的."合并"也是一个含糊不清的术语,我想要的只是将它们放在一起,无论它们是什么顺序,都考虑到性能.我不知道是否有可能合并......

另一件事,我的问题只是关于API,我不是在寻找构建我自己的代码(老板要求),这就是为什么与这个不同的原因:在Java中用恒定时间合并两个列表 - 那里没有有用的答案..

Ste*_*lly 3

如果您正在使用LinkedList,那么您很可能对索引访问不感兴趣(因为索引访问很慢......但请记住,列表仅存储引用,因此对于很少插入/删除的非常大的列表,您会更内存效率高ArrayList,因为它不需要在堆上分配每个节点)

所以你真正想要的是能给你大部分的东西List合同的东西……或者甚至可能不是。

很可能你想要的只是能给你的东西Iterable<String>......如果是这样的话,那么你的生活会非常轻松:

public class UberIterable<T> implements Iterable<T> {
  private final List<List<T>> lists;
  public UberIterable(List<T>... lists) {
    this.lists = Arrays.asList(lists); 
  }
  public Iterator<T> iterator() {
    return new Iterator<T>() {
      Iterator<List<T>> metaNext = lists.iterator();
      Iterator<T> next;
      public boolean hasNext() {
        while (true) {
          if (next != null && next.hasNext()) return true;
          if (metaNext.hasNext()) next = metaNext.next(); else return false; 
        }
      }
      public T next() {
        if (!hasNext()) throw new NoSuchElementException();
        return next.next();
      }
      public void remove() {
        throw new UnsupportedOperation();
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这是一个基本的实现,它将为您提供许多列表的合并视图。如果您想获得更多的合同,List您可以重复相同的技巧,只有更好的实现ListIterator才能获得您可能想要的很多东西,或者最终通过使用新的实现扩展AbstractList和覆盖适当的方法ListIterator