list的几种方式以及传递类型

283 阅读2分钟

这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战

猫和老鼠.jpg

前言:   本篇文章 是我关于MySQL的第19篇文章,水平一般、能力有限。文章写的比较浅,适合新手来看。本篇文章简单介绍一下生成list的几种方式以及传递类型。

一. list的创建

  1. 最简单方式利用new List来创建
List<Integer> list1 = new ArrayList<>();
list1.add(1);
  1. 用Arrays.asList方式来创建
List<String> list2 = Arrays.asList("111", "222");

遇到的问题:该创建的list2其实内部创建了一个ArrayList对象,该对象并没有add和remove等方法,增删会报错。

  1. 用Lists.newArrayList创建
ArrayList<Integer> list3 = Lists.newArrayList(111333);
  1. 用流加 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)]