如何在Java中有效地合并两个列表?

问题描述

有几种合并Java中列表的方法

  • 您可以拨打ArrayList(Collection<? extends E> c)
  • 您可以使用流API,例如Stream.concat()Stream.of(listA,listB).forEach()
  • 还有更多...

将两个随机访问列表合并为新的随机访问列表的最有效的内存和性能方法是什么?

解决方法

您尚未定义上下文中“合并”的含义。这个答案假设它的意思是“组合成一个列表”。

要减少使用的内存和处理量,请创建一个大小恰好正确的列表,然后依次将每个列表添加到其中。

[2]

这消除了在List<E> result = new ArrayList<>(list1.size() + list2.size()); result.addAll(list1); result.addAll(list2); 期间可能发生的冗余内存分配和对象创建。

,

尝试执行此操作,通过执行浅表复制来创建包含所有元素的不可变列表。请注意,对源列表的更改将反映在结果列表中(因此,实际的不变性取决于输入列表的不变性/访问性)。

public class MergedList<T> extends AbstractList<T> {

    private final List<T>[] lists;
    private final int size;

    @SafeVarargs
    MergedList(List<T>... lists) {
        this.lists = lists.clone();
        this.size = Arrays.stream(lists).mapToInt(list -> list.size()).sum();
    }

    @Override
    public T get(int index) {
        for (List<T> list : lists)
            if (index < list.size())
                return list.get(index);
            else
                index -= list.size();
        throw new IndexOutOfBoundsException("index");
    }

    @Override
    public int size() {
        return size;
    }

}

List<Integer> a = List.of(1,2,3,4);
List<Integer> b = List.of(5,6,7);
List<Integer> c = new MergedList<>(a,b);
System.out.println(c);

输出

[1,4,5,7]

考虑到原始列表已更新,最好删除字段size并执行以下操作:

    @Override
    public int size() {
        return Arrays.stream(lists).mapToInt(list -> list.size()).sum();
    }
,

您可以使用Apache commons library-

ListUtils.union(listA,listB);

使用并行Java8流可能会更好,而不仅仅是大型数据集的流。

Stream.concat(list1.parallelStream(),list1.parallelStream())
      .collect(Collectors.toList());

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...