Arrays.asList():使用指南
Arrays.asList() 是一个 Java 的静态方法,它可以把一个数组或者多个参数转换成一个 List 集合。这个方法可以作为数组和集合之间的桥梁,方便我们使用集合的一些方法和特性。本文将介绍 Arrays.asList() 的语法、应用场景、坑点和总结。
- 语法
- 应用场景
- 坑点
- 总结
语法
Arrays.asList() 的语法格式如下:
public static <T> List<T> asList(T... a)
这个方法接受一个泛型参数 T,表示数组或者参数的类型。T 必须是一个引用类型,不能是一个基本类型,例如 int, double, char 等。如果传入一个基本类型的数组,Arrays.asList() 会把它当作一个 Object 类型的元素,而不是把它的每个元素当作 Object 类型。这样就会导致返回的 List 只有一个元素,就是原始数组本身。
Arrays.asList() 返回的 List 是一个 Arrays 类的内部类,它持有一个对原始数组的引用。这意味着对 List 的修改会反映到数组上,反之亦然。但是,这个 List 的大小是固定的,不能进行增加或者删除的操作,否则会抛出 UnsupportedOperationException 异常。
Arrays.asList() 返回的 List 是可序列化的,并且实现了 RandomAccess 接口,表示它支持随机访问。
应用场景
Arrays.asList() 可以用在以下几种场景中:
- 当我们需要创建一个不需要改变大小或者内容的 List 集合时,我们可以使用 Arrays.asList() 来快速地初始化一些元素。例如:
// 使用 Arrays.asList() 创建一个不可变的 List
List<String> list = Arrays.asList("a", "b", "c");
System.out.println(list); // [a, b, c]
- 当我们需要创建一个空的或者单元素的 List 集合时,我们可以使用 Arrays.asList() 来简化代码。例如:
// 使用 Arrays.asList() 创建一个不可变的空 List
List<String> emptyList = Arrays.asList();
System.out.println(emptyList); // []
// 使用 Arrays.asList() 创建一个不可变的单元素 List
List<String> singletonList = Arrays.asList("a");
System.out.println(singletonList); // [a]
- 当我们需要从一个数组或者其他集合类创建一个不可变的 List 集合时,我们可以使用 Arrays.asList() 来方便地转换。例如:
// 使用 Arrays.asList() 从数组创建一个不可变的 List
String[] array = {"a", "b", "c"};
List<String> listFromArray = Arrays.asList(array);
System.out.println(listFromArray); // [a, b, c]
// 使用 Arrays.asList() 从其他集合类创建一个不可变的 List
Set<String> set = new HashSet<>();
set.add("a");
set.add("b");
set.add("c");
List<String> listFromSet = Arrays.asList(set.toArray(new String[0]));
System.out.println(listFromSet); // [a, b, c]
- 当我们需要使用一些集合类的方法或者特性时,我们可以使用 Arrays.asList() 来把数组转换成集合。例如:
// 使用 Arrays.asList() 把数组转换成集合,并使用 Collections 类的方法
String[] array = {"a", "b", "c"};
List<String> list = Arrays.asList(array);
Collections.sort(list); // 对集合进行排序
System.out.println(list); // [a, b, c]
Collections.reverse(list); // 对集合进行反转
System.out.println(list); // [c, b, a]
Collections.shuffle(list); // 对集合进行随机打乱
System.out.println(list); // [b, a, c] 或者其他随机顺序
// 使用 Arrays.asList() 把数组转换成集合,并使用 Stream API
String[] array = {"a", "b", "c"};
List<String> list = Arrays.asList(array);
list.stream().forEach(System.out::println); // 对集合进行遍历并打印每个元素
list.stream().map(String::toUpperCase).forEach(System.out::println); // 对集合进行映射并打印每个元素的大写形式
list.stream().filter(s -> s.startsWith("a")).forEach(System.out::println); // 对集合进行过滤并打印以 a 开头的元素
坑点
Arrays.asList() 也有一些坑点,需要注意以下几点:
- Arrays.asList() 不支持基本数据类型的数组,因为它只能接受 Object 类型的参数或者数组。基本数据类型(如 int, double, char 等)不是 Object 的子类,所以不能直接作为 Arrays.asList() 的参数。如果传入一个基本数据类型的数组,Arrays.asList() 会把它当作一个 Object 类型的元素,而不是把它的每个元素当作 Object 类型。这样就会导致返回的 List 只有一个元素,就是原始数组本身。
如果想要把一个基本数据类型的数组转换成 List,有以下几种方法:
- 使用循环遍历数组,并把每个元素添加到 List 中。这样可以利用自动装箱(autoboxing)的特性,把基本数据类型转换成对应的包装类(如 Integer, Double, Character 等)。
- 使用 Java 8 中的 Stream API,可以用一行代码实现数组到 List 的转换。可以使用 Arrays.stream() 或者 IntStream.of() 等方法,然后调用 boxed() 和 collect() 方法。
- 使用第三方库,如 Guava 或者 Apache Commons Lang,它们提供了一些工具类和方法来处理基本数据类型的数组和集合。
示例代码如下:
// 使用循环遍历数组,并把每个元素添加到 List 中
int[] array = {1, 2, 3};
List<Integer> list = new ArrayList<>();
for (int num : array) {
list.add(num); // 利用自动装箱
}
System.out.println(list); // [1, 2, 3]
// 使用 Stream API 实现数组到 List 的转换
int[] array = {1, 2, 3};
List<Integer> list = Arrays.stream(array).boxed().collect(Collectors.toList());
System.out.println(list); // [1, 2, 3]
// 使用 Guava 实现数组到 List 的转换
int[] array = {1, 2, 3};
List<Integer> list = Ints.asList(array);
System.out.println(list); // [1, 2, 3]
- Arrays.asList() 返回的 List 是不可变的,也就是说,不能对它进行增加或者删除的操作,否则会抛出 UnsupportedOperationException 异常。这是因为 Arrays.asList() 返回的 List 是一个 Arrays 类的内部类,它没有实现 add() 和 remove() 等方法。
如果想要创建一个可变的 List 集合,有以下几种方法:
- 使用 ArrayList 的构造器,并把 Arrays.asList() 作为参数传入。这样可以创建一个新的 ArrayList 对象,并复制原始数组中的元素。例如:
// 使用 ArrayList 的构造器创建一个可变的 List
String[] array = {"a", "b", "c"};
List<String> list = new ArrayList<>(Arrays.asList(array));
System.out.println(list); // [a, b, c]
list.add("d"); // 可以增加元素
System.out.println(list); // [a, b, c, d]
- 使用 Java 8 中的 Stream API,可以用一行代码实现数组到 List 的转换。可以使用 Arrays.stream() 或者 IntStream.of() 等方法,然后调用 collect() 方法。例如:
// 使用 Stream API 实现数组到 List 的转换
int[] array = {1, 2, 3};
List<Integer> list = Arrays.stream(array).boxed().collect(Collectors.toList());
System.out.println(list); // [1, 2, 3]
list.add(4); // 可以增加元素
System.out.println(list); // [1, 2, 3, 4]
总结
Arrays.asList() 是一个简单而有用的方法,它可以帮助我们把数组转换成 List 集合。但是它也有一些限制和注意事项,我们应该根据具体的需求和场景来选择合适的方法。希望这篇文章对你有所帮助,谢谢您的阅读。
关注公众号【waynblog】每周分享技术干货、开源项目、实战经验、国外优质文章翻译等,您的关注将是我的更新动力!
Arrays.asList():使用指南的更多相关文章
- Arrays.asList()使用指南
简介 Arrays.asList()在平时开发中还是比较常见的,我们可以使用它将一个数组转换为一个List集合. String[] myArray = { "Apple", &qu ...
- Arrays.asList使用指南和一些坑(转)
一.java.util.Arrays.asList() 的一般用法 List 是一种很有用的数据结构,如果需要将一个数组转换为 List 以便进行更丰富的操作的话,可以这么实现: String[] m ...
- Java集合工具类使用的一些坑,Arrays.asList()、Collection.toArray()、foreach
Arrays.asList() 使用指南 最近使用Arrays.asList()遇到了一些坑,然后在网上看到这篇文章:Java Array to List Examples 感觉挺不错的,但是还不是特 ...
- 【转】java.util.Arrays.asList 的用法
DK 1.4对java.util.Arrays.asList的定义,函数参数是Object[].所以,在1.4中asList()并不支持基本类型的数组作参数. JDK 1.5中,java.util.A ...
- Arrays.asList()注意
api: public static <T> List<T> asList(T... a) 返回一个受指定数组支持的固定大小的列表.(对返回列表的更改会“直接写”到数组.)此方 ...
- Arrays.toString Arrays.asList
import java.util.Arrays; public class TestCalc{ public static void main(String[] args) { ,,,,,,,}; / ...
- Arrays.asList()使用注意点
今天看代码时, 发现书上使用了Arrays.asList()方法, 将一个数组转成了List, 然后说到得到的List不能调用add(), remove()方法添加元素或者删除,带着疑问看了下内部实现 ...
- Arrays.asList(数组) 解说
最近在用Arrays的asList()生成的List时,List元素的个数时而不正确. Java代码 一:Arrays.asList(数组)该方法是将数组转化为集合(该方法主要用于Object对象数组 ...
- Arrays.asList方法总结
import java.util.Arrays; import java.util.List; /** * * 本类演示了Arrays类中的asList方法 * 通过四个段落来演示,体现出了该方法的相 ...
- Arrays.asList的使用及异常问题
将数组转成List问题,通常我们习惯这样写成:List<String> list = Arrays.asList("1","2"); 于是我们这样就 ...
随机推荐
- 记一次加锁导致ECS服务器CPU飙高的处理
导航 火线告警,CPU飚了 版本回退,迅速救火 猜测:分布式锁是罪魁祸首 代码重构,星夜上线 防患未然,功能可开关 高度戒备,应对早高峰 实时调整方案,稳了 结语 参考 本文首发于智客工坊-<记 ...
- Kubernetes——构建平台工程的利器
作者|Loft Team 翻译|Seal软件 链接|https://loft.sh/blog/why-platform-engineering-teams-should-standardize-on- ...
- 【后端面经-Java】AQS详解
目录 1. AQS是什么? 2. AQS核心思想 2.1 基本框架 2.1.1 资源state 2.1.2 CLH双向队列 2.2 AQS模板 3. 源码分析 3.1 acquire(int) 3.1 ...
- JavaCV的摄像头实战之十二:性别检测
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<JavaCV的摄像头实战> ...
- 「Python实用秘技15」pandas中基于范围条件进行表连接
本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第15 ...
- 【Springboot】拦截器
Springboot 拦截器 1.什么是拦截器? 拦截器可以根据 URL 对请求进行拦截,主要应用于登陆校验.权限验证.乱码解决.性能监控和异常处理等功能. 2.定义拦截器步骤 在 Spring Bo ...
- MD文本编辑工具推荐-matktext
最开始是用vscode编辑markdown文档,左边写右边看效果的实时渲染模式,对于markdown编辑来说是多余的,多是文字类的内容,配以插图,复杂表格和脑图则更少.之后接触到Typora,所打即所 ...
- SVE学习记录- SVE特性以及寄存器
本文地址:https://www.cnblogs.com/wanger-sjtu/p/SVE_learn_0.html SVE对比NEON有几个新增的地方. 变长的向量 支持Gather-load & ...
- SAS - PROC FCMP
PROC FCMP 概述 PROC FCMP 可用于自定义函数(funcion)和子程序(subroutines).自定义函数和子程序的名称的最大长度为 32,长度超过 32 的名称虽然可以定义,但无 ...
- Redis集群搭建之三大模式
一.简介: Redis 是一个开源的 key-value 存储系统,由于出众的性能,大部分互联网企业都用来做服务器端缓存.Redis 在3.0版本前只支持单实例模式,虽然支持主从模式.哨兵模式部署来解 ...