简单介绍List和数组转List集合

摘要:介绍List接口和创建List对象的三个常用方法,介绍数组转换List的几种方法。

综述

  线性列表List是一个接口,继承自接口Collection,习惯性地会将实现了List接口的对象称为List集合。List有两个常用的实现类ArrayList和LinkedList,在开发中使用率最多的是可以动态扩容的ArrayList。ArrayList 底层是数组结构,查询快,增删慢;LinkedList 底层结构是链表,查询慢,增删快。从功能特性上来看,List是有序、可重复的单列集合,集合中的每个元素都有对应的顺序索引,可以通过该索引来精确地控制指定位置上的元素。默认情况下,List会按元素的添加顺序给元素设置索引,第一个添加到List集合中的元素索引为0,第二个为1,以此类推可以得到后面元素的索引。所以List和数组的行为几乎相同,都是有序的存储结构。

如何创建List

  下面是创建List的三种常见方法:

  • 通过多态方式:new + List的某个子类,譬如 new ArrayList() 等;
  • List.of():of()方法可以根据给定的元素快速创建一个只读的List对象,但该方法不接受null元素,如果传入null会抛出NullPointerException异常。
  • Guava Lists工具类:使用方法为List<Integer> list = Lists.newArrayList(32, 0, 77, 90, 700, 132, 5, 36);,需要引入的guava包如下:
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava-parent</artifactId>
    <version>32.0.0-jre</version>
</dependency>

六种数组转List的方法

  在工作中,经常遇到需要对List与数组互相转换的场景,因而本文介绍几种数组转换为List的方法。下文使用的测试用例若无特殊说明,都基于如下数组:

Integer[] arr = {32, 0, 77, 90, 700, 132, 5, 36};

for循环遍历

  通过for循环遍历把元素添加到list集合是最基础的一种操作:

List<Integer> list = new ArrayList<>();
for (int one : arr) {
    list.add(one);
}

Arrays.asList()

  数组泛型如果是基础数据类型,需要转为引用数据类型,如int 转为Integer。如果直接使用基础数据类型,那么输出的是地址,因为list集合存放的是数组。下面的示例是可以顺利转换的:

//集合封装的是ints
List<Integer> ints = Arrays.asList(arr);
Arrays.asList(arr).forEach(System.out::println);

  函数Arrays.asList(array) 返回的、只读的List对象是由原始数组构成的、固定大小的列表,实现类是 java.util.Arrays 类中一个私有静态内部类 java.util.Arrays.ArrayList。java.util.Arrays.ArrayList 类封装了 set()、get()和contains() 等方法,但是没有 add()和remove() 方法,所以调用add() 或remove() 方法会抛出异常UnsupportedOperationException。

new ArrayList<>(Arrays.asList(array))

  这样定义的List可以进行增删操作,推荐这么转换。

List<Integer> list = new ArrayList<>(Arrays.asList(arr));
list.forEach(System.out::println);

  此转换方法创建了一个新的List集合,对集合的修改不会改变数组里的值。

Collections.addAll()

  通过集合工具类Collections.addAll()方法转换:

 List<Integer> list = new ArrayList<>(arr.length);
 Collections.addAll(list, arr);
 list.add(897);
 list.forEach(System.out::println);

  根据数组长度创建一个相同长度的list,然后通过Collections.addAll()函数把数组里的元素添加到list里(最高效)。这样得到的对象可以直接添加或者删除元素。

stream流collect方法

  可以使用流stream将下列三种数组转换为List——Integer[]、Long[]、Double[]。

List<Integer> list = Arrays.stream(arr).collect(Collectors.toList());
list.add(897);
list.forEach(System.out::println);

  在Java 8中,可以使用如下装箱方法把基础数据类型数组int[]、long[]、double[]转换成List集合,但是其它数据类型比如short[]、byte[]、char[],暂不支持。

List<Integer> list = Arrays.stream(new int[] {1, 2, 3}).boxed().collect(Collectors.toList());
list.add(777);
list.forEach(System.out::println);

  备注:为什么int[]不能直接转为List,而Integer[]可以转为List?因为List的泛型必须是引用类型。

Stream.of

  通过Stream.of方法转换为List:

List<Integer> list = Stream.of(arr).collect(Collectors.toList());
list.add(7779);
list.forEach(System.out::println);

结束语

  如果大家对上述文章有好的建议,欢迎在评论区留言,楼兰胡杨会虚心接受、认真聆听、积极反馈。

posted @ 2023-07-29 21:15  楼兰胡杨  阅读(405)  评论(0编辑  收藏  举报