摘要:介绍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);

结束语

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

简单介绍List和数组转List集合的更多相关文章

  1. Java集合简单介绍

    再最前面分享一下我再学习集合时的方法: 1.首先了解各集合的定义和特点 2.集合的构造方法和常用方法(增删改查等) 3.了解集合使用的场景,再什么情况下使用什么类型的集合(关键是集合的特性) 4.了解 ...

  2. JavaScript数组的简单介绍

    ㈠对象分类 ⑴内建对象 ⑵宿主对象 ⑶自定义对象   ㈡数组(Array) ⑴简单介绍 ①数组也是一个对象 ②它和我们普通对象功能类似,也是用来存储一些值的 ③不同的是普通对象是使用字符串作为属性名的 ...

  3. Java Linked集合的简单介绍和常用方法的使用

    LinkedList的简单介绍 java.util.LinkedList 集合数据存储的结构是链表结构.LinkedList是一个双向链表在实际开发中,对一个集合元素的添加和删除,经常涉及到首尾操作, ...

  4. 决策树简单介绍(二) Accord.Net中决策树的实现和使用

    决策树介绍 决策树是一类机器学习算法,可以实现对数据集的分类.预测等.具体请阅读我另一篇博客(http://www.cnblogs.com/twocold/p/5424517.html). Accor ...

  5. Reactive ExtensionsLINQ和Rx简单介绍

    LINQ和Rx简单介绍 相信大家都用过Language Integrated Query (LINQ),他是一种强大的工具能够从集合中提取数据.Reactive Extensions(Rx)是对LIN ...

  6. C++map类型 之 简单介绍

    一:map的前世今生 (1)从关联容器与顺序容器说起.关联容器通过键(key)存储和读取元素.而顺序容器则通过元素在容器中的位置顺序存储和訪问元素(vector,queue,stack,list等). ...

  7. Mongodb简单介绍安装

    具体详细内容,请查阅 Mongodb官方文档 一.简单介绍 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. M ...

  8. professional cuda c programming--CUDA库简单介绍

    CUDA Libraries简单介绍   上图是CUDA 库的位置.本文简要介绍cuSPARSE.cuBLAS.cuFFT和cuRAND.之后会介绍OpenACC. cuSPARSE线性代数库,主要针 ...

  9. JSR 303 - Bean Validation 简单介绍及用法

    一.JSR-303简单介绍 JSR-303 是 JAVA EE 6 中的一项子规范.叫做 Bean Validation,官方參考实现是Hibernate Validator. 此实现与 Hibern ...

  10. EL表达式的简单介绍

    EL表达式的简单介绍 一.JSP EL语言定义 E L(ExpressionLanguage)  目的:为了使JSP写起来更加简单. 表达式语言的灵感来自于ECMAScript 和 XPath 表达式 ...

随机推荐

  1. 【2022_12_2】Fibersim安装记录

    Fibersim 安装记录 1. 为什么要写这个文章? 因为我前前后后装了四天才装成功.在我的电脑上,fibersim14 16 17 15 挂到UG10 12 CatiaV5-6R2019 2018 ...

  2. java如何实现对List集合进行分页

    对List集合进行分页: private <T> Page<T> listToPage(List<T> dataList, Integer pageSize, In ...

  3. linux mongodb安装

    更新依赖包 安装前我们需要安装各个 Linux 平台依赖包. Red Hat/CentOS: sudo yum install libcurl openssl Ubuntu 18.04 LTS (&q ...

  4. pandas -- 处理非数值型数据 -- 数据分析三剑客(核心)

    博客地址:https://www.cnblogs.com/zylyehuo/ 开发环境 anaconda 集成环境:集成好了数据分析和机器学习中所需要的全部环境 安装目录不可以有中文和特殊符号 jup ...

  5. docker-compose up -d 运行容器秒自动停止解决方案

    正常的我们运行Docker-Compose的服务 docker-compose -f docker-compose.yml up -d mysql-setup 执行Docker ps 查看存活的容器 ...

  6. 远程服务器画面GUI传输到本地显示

    远程服务器画面GUI传输到本地显示 这篇文章主要介绍远程服务器(Ubuntu系统)的GUI画面传输到本地(本地Ubuntu或者Windows)显示的方法. 远程Ubuntu系统 --> 本地Wi ...

  7. 必看!2025 年颠覆测试行业的 10 大 AI 自动化测试工具/平台(上篇)

    大家好,我是狂师. 上周小孩子生病,住院照顾,停更了几天. 各位看官,等着急了吧,之前有粉丝后台留言,想了解学习一下,AI这么火爆,那市面上AI与自动化测试结合起来的有哪些推荐的工具/平台. 今天就这 ...

  8. 深入理解 C++ 条件变量:为何 `wait` 钟爱 `std::unique_lock`?

    深入理解 C++ 条件变量:为何 wait 钟爱 std::unique_lock?在 C++ 多线程编程中,线程间的协调是一个核心挑战.我们经常需要一个线程等待某个条件满足(例如,等待任务队列非空, ...

  9. FastAPI依赖注入:链式调用与多级参数传递

    title: FastAPI依赖注入:链式调用与多级参数传递 date: 2025/04/05 18:43:12 updated: 2025/04/05 18:43:12 author: cmdrag ...

  10. CH9121替换注意事项

    CH9121A 基于前版CH9121(无后缀字母)升级,引脚基本兼容,替换时需调整外围电路. 升级内容: 精简供电方式由3.3&1.8v双电源供电改为3.3v单电源供电: I/O 口支持3.3 ...