java Arrays.asList() 数组转集合
主要作用:将数组转化为List
使用Arrays.asList()的原因无非是想将数组或一些元素转为集合,而你得到的集合并不一定是你想要的那个集合。
而一开始asList的设计时用于打印数组而设计的,但jdk1.5开始,有了另一个比较更方便的打印函数Arrays.toString(),于是打印不再使用asList(),而asList()恰巧可用于将数组转为集合。
错误一
如果你这样使用过,那你可要注意了。
将基本类型数组作为asList的参数
int[] arr = {1,2,3}; List list = Arrays.asList(arr); System.out.println(list.size());
由于Arrays.ArrayList参数为可变长泛型,而基本类型是无法泛型化的,所以它把int[] arr数组当成了一个泛型对象,所以集合中最终只有一个元素arr。
错误二
将数组作为asList参数后,修改数组或List
String[] arr = {"欢迎","关注","Java"}; List list = Arrays.asList(arr); arr[1] = "爱上"; list.set(2,"我"); System.out.println(Arrays.toString(arr)); System.out.println(list.toString());
由于asList产生的集合元素是直接引用作为参数的数组,所以当外部数组或集合改变时,数组和集合会同步变化,这在平时我们编码时可能产生莫名的问题。
错误三
数组转换为集合后,进行增删元素
String[] arr = {"欢迎","关注","Java"}; List list = Arrays.asList(arr); list.add("新增"); list.remove("关注"); System.out.println(list.toString());
由于asList产生的集合并没有重写add,remove等方法,所以它会调用父类AbstractList的方法,而父类的方法中抛出的却是异常信息。
解释:
其实该方法返回的,不是我们以为的集合 ArrayList, 而是 Arrays的一个静态内部类 java.util.Arrays.ArrayList
Arrays.ArrayList 是工具类 Arrays 的一个内部静态类,它没有完全实现List的方法,索引不支持add,remove等这些方法,
而正常的ArrayList直接实现了List 接口,实现了List所有方法。
一些常见的数组转集合的用法
支持基本类型的方法
1 如果使用Spring
int[] a = {1,2,3}; List list = CollectionUtils.arrayToList(a); System.out.println(list);
2 如果使用Java 8
int intArray[] = {1, 2, 3}; List iList = Arrays.stream(intArray) .boxed() .collect(Collectors.toList()); System.out.println(iList);
数组转ArrayList
1遍历转换
Integer intArray[] = {1, 2, 3}; ArrayList<Integer> aList = new ArrayList<>(); for (Integer i: intArray){ aList.add(i); }
显然这种方式不够优雅!反正我不愿意使用。
2 使用工具类
上面方案不够优雅,那么这种相对来说优雅一些。
List list = new ArrayList(); Collections.addAll(list, "welcome", "to", "china");
其实它内部实现机制,也是遍历元素,一个个往集合里加
3 两个集合类结合
将Arrays.asList返回的集合作为ArrayList的构造参数
ArrayList arrayList = new ArrayList(Arrays.asList("welcome", "to", "china"));
当然此处肯定不能是基本类型的数组了(asList入仓得可以转为泛型),非基本类型都可以
原文地址:https://www.cnblogs.com/hup666/p/13416911.html
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- ZooKeeper 的应用场景
- 在 K8S 部署一个 Spark History Server - 篇3
- Go 学习笔记-1
- Tensorflow-gpu 运行在 cpu 母机的问题
- R语言入门之散点图
- Python函数(一)
- Spark on Kubernetes 动态资源分配
- R语言入门之偏度(skewness)与峰度(kurtosis)
- Spark Operator 是如何提交 Spark 作业
- R语言进阶之聚类分析
- 来 左边 跟我一起画彩虹
- Kubernetes v1.13 对 GPU 的支持
- Spark 3.0 对 GPU 做了什么支持
- Go语言整数值转字符串的效率问题
- R语言进阶之判别分析