这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战
前言: 本篇文章 是我关于MySQL的第19篇文章,水平一般、能力有限。文章写的比较浅,适合新手来看。本篇文章简单介绍一下生成list的几种方式以及传递类型。
一. list的创建
- 最简单方式利用new List来创建
List<Integer> list1 = new ArrayList<>();
list1.add(1);
- 用Arrays.asList方式来创建
List<String> list2 = Arrays.asList("111", "222");
遇到的问题:该创建的list2其实内部创建了一个ArrayList对象,该对象并没有add和remove等方法,增删会报错。
- 用Lists.newArrayList创建
ArrayList<Integer> list3 = Lists.newArrayList(111,333);
- 用流加 Collectors来构建
List<Integer> list4 = Stream.of(122,333).collect(Collectors.toList());
二. 时间计算
List<Integer> numList=new ArrayList<>();
for (int i = 0; i < 10000; i++) {
numList.add(i);
}
// 0. 默认方法 利用new List add来创建
stopWatch.start("new List add");
List<Integer> list0 = new ArrayList<>();
numList.forEach(a->list0.add(a));
stopWatch.stop();
// 1. 默认方法 利用new List addAll来创建
stopWatch.start("new List addAll");
List<Integer> list1 = new ArrayList<>();
list1.addAll(numList);
stopWatch.stop();
// 2. 默认方法 利用new ArrayList来创建
stopWatch.start("Arrays.asList");
List<Integer> list2 = Arrays.asList(numList.toArray(new Integer[numList.size()]));
stopWatch.stop();
// 3. 用Lists.newArrayList
stopWatch.start("Lists.newArrayList");
ArrayList<Integer> list3 = Lists.newArrayList(numList);
stopWatch.stop();
// 4. 用流构建
stopWatch.start("stream Collectors.toList()");
List<Integer> list4 = numList.parallelStream().collect(Collectors.toList());
stopWatch.stop();
下面是得到的时间
StopWatch 'list测试': running time = 11035100 ns
---------------------------------------------
ns % Task name
---------------------------------------------
000935900 008% new List add
000049700 000% new List addAll
000056100 001% Arrays.asList
001935300 018% Lists.newArrayList
008058100 073% stream Collectors.toList()
我们从上面的时间可以看出,addAll方法是最快的。流创建的list反而是最慢的。
三. 值传递
StopWatch stopWatch = new StopWatch("dog list测试");
List<Dog> numList=new ArrayList<>();
for (int i = 0; i < 10; i++) {
numList.add(Dog.builder().age(i).build());
}
stopWatch.start("new List add");
// 1. 默认方法 利用new ArrayList来创建
List<Dog> list1 = new ArrayList<>();
numList.forEach(a->list1.add(a));
stopWatch.stop();
stopWatch.start("new List addAll");
// 1. 默认方法 利用new ArrayList来创建
List<Dog> list2 = new ArrayList<>();
list2.addAll(numList);
stopWatch.stop();
stopWatch.start("Lists.newArrayList");
// 3. 用Lists.newArrayList
ArrayList<Dog> list3 = Lists.newArrayList(numList);
stopWatch.stop();
stopWatch.start("stream Collectors.toList()");
// 4. 用流构建
List<Dog> list4 = numList.parallelStream().collect(Collectors.toList());
stopWatch.stop();
System.out.println(stopWatch.prettyPrint());
numList.get(0).setAge(999);
System.out.println("list1="+list1);
System.out.println("list2="+list2);
System.out.println("list3="+list3);
System.out.println("list4="+list4);
下面是得到的测试结果,在list中的值是基本数据类型是,做更改是不会影响list的。 但是如果是引用数据类型,所有的copy方式都是位置传递,因为内部的对象不是新创建的。
StopWatch 'dog list测试': running time = 4142000 ns
---------------------------------------------
ns % Task name
---------------------------------------------
000184600 004% new List add
000005900 000% new List addAll
000815000 020% Lists.newArrayList
003136500 076% stream Collectors.toList()
list1=[Dog(age=999), Dog(age=1), Dog(age=2), Dog(age=3), Dog(age=4)]
list2=[Dog(age=999), Dog(age=1), Dog(age=2), Dog(age=3), Dog(age=4)]
list3=[Dog(age=999), Dog(age=1), Dog(age=2), Dog(age=3), Dog(age=4)]
list4=[Dog(age=999), Dog(age=1), Dog(age=2), Dog(age=3), Dog(age=4)]