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