摘要:介绍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. 【目标检测】一、初始的R-CNN与SVM

    1.流程 为什么要用SVM而不是CNN最后一层的softmax? 取什么模型必然是有标准衡量,这个流程取得是书上[4]写的,作者说他得实验证明SVM比FC的mAP要高,所以我流程暂且这样画了. R-C ...

  2. 【Jmatpro 10.0】根据材料牌号输出应力-应变曲线

    1.前提条件 Jmatpro 软件 一个材料牌号或者材料成分数据 2. 步骤 以 X15Cr 13牌号金属为案例 材料数据来自:材数库 运行jmatpro软件 选择 material type:sta ...

  3. DeepSeek 多模态大模型 Janus-Pro 本地部署教程

    下载模型仓库 git clone https://github.com/deepseek-ai/Janus.git 国内下载仓库失败时,可以使用以下代理: git clone https://gith ...

  4. SQLSTATE[HY000] [2002] Connection refused报错 PHP连接docker容器中的mysql

    Laradock 是基于 Docker 提供的完整 PHP 本地开发环境 在框架中连接 MySQL 时 报错 SQLSTATE[HY000] [2002] Connection refused 主要还 ...

  5. 防止恶意解析——禁止通过IP直接访问网站

    一.什么是恶意解析 一般情况下,要使域名能访问到网站需要两步,第一步,将域名解析到网站所在的主机,第二步,在web服务器中将域名与相应的网站绑定.但是,如果通过主机IP能直接访问某网站,那么把域名解析 ...

  6. [WPF]XAML中使用IMultiValueConverter实现Command的多参数传参

    问题 如何对ICommand传入多个参数? 背景 最近在做一个WPF的开发,有多个相近的功能写了不同的Command,因为要对应不同的对象.因为是CtrlCV,显得代码有点冗赘不够优雅,但是IComm ...

  7. BUUCTF---checkln(ROT加密)

    题目 dikqTCpfRjA8fUBIMD5GNDkwMjNARkUwI0BFTg== 解题 1.看见有==,尝试base64解码,但解码失败 2.尝试其它Base加密均失败 3.重新思考有等于号的加 ...

  8. MySQL基础架构-架构详解

    mysql基础架构图 架构详解 连接器部分 整体功能 建立连接 维持管理连接 校验用户名密码,查询权限 最佳实践 不要在命令行客户端中明文输入密码 -p 中不要使用明文密码 修改权限,需要重新建立连接 ...

  9. 【SpringMVC】处理模型数据

    处理模型数据 Spring MVC 提供了以下几种途径输出模型数据: ModelAndView: 处理方法返回值类型为 ModelAndView时, 方法体即可通过该对象添加模型数据 Map 及 Mo ...

  10. SLAM导航全栈书的正确打开姿势

    SLAM导航全栈书的正确打开姿势 随着人工智能.机器人.无人驾驶等技术的蓬勃发展,作为底层技术基石的SLAM也逐渐被大家所熟知.人工智能技术如果仅仅停留在虚拟的网络和数据之中的话,那么它挖掘并利用知识 ...