List合并的5种方式,以及它的速度比较

package com.augurit.xmjg.portal.controller;

import org.apache.tools.ant.taskdefs.Java;

import java.time.Duration;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @author wyz
 * @version 1.0.0
 * @ClassName Mytest.java
 * @Description TODO
 * @createTime 2021年03月12日 14:55:00
 */
public class Mytest {
    public static void main(String[] args) {
        ArrayList<String> list_1 = new ArrayList<>();
        ArrayList<String> list_2 = new ArrayList<>();
        for (int i = 0; i < 10000 ; i++) {
            list_1.add(i+"");
        }
        for (int i = 10000; i < 20000 ; i++) {
            list_2.add(i+"");
        }
        LocalDateTime start1 = LocalDateTime.now();
        List<String> list = merge1(list_1, list_2);
        LocalDateTime end1 = LocalDateTime.now();
        System.out.println("merge1花费时间:"+ Duration.between(start1, end1).toMillis()+"毫秒");

        LocalDateTime start2 = LocalDateTime.now();
        List<String> list2 = merge2(list_1, list_2);
        LocalDateTime end2 = LocalDateTime.now();
        System.out.println("merge2花费时间:"+ Duration.between(start2, end2).toMillis()+"毫秒");

        LocalDateTime start3 = LocalDateTime.now();
        List<String> list3 = merge3(list_1, list_2);
        LocalDateTime end3 = LocalDateTime.now();
        System.out.println("merge3花费时间:"+ Duration.between(start3, end3).toMillis()+"毫秒");


        LocalDateTime start4 = LocalDateTime.now();
        List<String> list4 = merge4(list_1, list_2);
        LocalDateTime end4 = LocalDateTime.now();
        System.out.println("merge4花费时间:"+ Duration.between(start4, end4).toMillis()+"毫秒");

        LocalDateTime start5 = LocalDateTime.now();
        List<String> list5 = merge5(list_1, list_2);
        LocalDateTime end5 = LocalDateTime.now();
        System.out.println("merge5花费时间:"+ Duration.between(start5, end5).toMillis()+"毫秒");
    }
    //1.List接口提供addAll(Collection)了将指定集合的​​所有元素追加到列表末尾的方法。
    private static<T> List<T> merge1(List<T> list1,List<T> list2){
        ArrayList<T> list = new ArrayList<>();
        list.addAll(list1);
        list.addAll(list2);
        return list;
    }
    //2.使用ArrayList构造函数通过第一个列表初始化结果列表,从而避免对的额外调用addAll()
    public static<T> List<T> merge2(List<T> list1, List<T> list2)
    {
        List<T> list = new ArrayList<>(list1);
        list.addAll(list2);

        return list;
    }
    // 3.Collections类提供了对集合进行操作的几种有用的静态实用程序方法。
    // 一种这样的方法是addAll(Collection, T[])将所有指定的元素添加到指定的集合中
    //此方法类似于List.addAll()但可能运行得更快。
    public static List<String> merge3(List<String> list1, List<String> list2)
    {
        List<String> list = new ArrayList<>();

        Collections.addAll(list, list1.toArray(new String[0]));
        Collections.addAll(list, list2.toArray(new String[0]));

        return list;
    }
    //4.我们使用静态工厂方法从列表中获取由元素组成的流,
    // Stream.of()并使用Collector将所有元素累积到新列表中
    public static<T> List<T> merge4(List<T> list1, List<T> list2)
    {
        return Stream.of(list1, list2)
                .flatMap(x -> x.stream())
                .collect(Collectors.toList());
    }
    //5.使用forEach()代替累积所有元素来避免使用收集器
    public static<T> List<T> merge5(List<T> list1, List<T> list2)
    {
        List<T> list = new ArrayList<>();
        Stream.of(list1, list2).forEach(list::addAll);

        return list;
    }
}

结果:
merge1花费时间:1毫秒
merge2花费时间:0毫秒
merge3花费时间:3毫秒
merge4花费时间:14毫秒
merge5花费时间:2毫秒

速度对比:merge2 > merge1 > merge5 > merge3 > merge4

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值