浅谈Arrays.asList()方法
一.引言:
实际操作中,我们会遇到需要将数组转化为list的情况,这个时候我们可以借助Java的Arrays类的方法进行便捷操作,接下来来看以下操作的例子:
Integer[] arr= {1, 2, 3};//1
List<Integer> list = new ArrayList<>(Arrays.asList(arr));//2
list.add(4);
System.out.println(list.toString());
结果如下:
[1, 2, 3, 4]
接下来让我们来看下经常出现的两种方式的情况。
二.定义数组的类型为包装类型或者是基本类型?
我们来看下面一个例子:
int[] arr1= {1, 2, 3};
Integer[] arr2 = {1, 2, 3};
List<int[]> list1 = new ArrayList<>(Arrays.asList(arr1));
List<Integer> list2 = new ArrayList<>(Arrays.asList(arr2));
System.out.println("基本类型转化后的集合大小为:"+list1.size()+"\n包装类型转化后的集合大小为:"+list2.size());
输出结果为:
基本类型转化后的集合大小为:1
包装类型转化后的集合大小为:3
分析:
我们看一下asList()方法,
public static <T> List<T> asList(T... a) {return new ArrayList<>(a);}
可以看到他的参数为T,我们来简单普及下java泛型T,泛型T本质是Object类型 ,是引用类型 ,不包括基本类型,int这种基本类型不是。我们知道任何类型的对象都有一个 class 属性,这个属性代表了这个类型本身。原生数据类型,比如 int,short,long等,是没有这个属性的,具有 class 属性的是它们所对应的包装类 Integer,Short,Long。
因此,这个错误产生的原因可解释为:asList 方法的参数必须是对象或者对象数组,而原生数据类型不是对象——这也正是包装类出现的一个主要原因。当传入一个原生数据类型数组时,asList 的真正得到的参数就不是数组中的元素,而是数组对象本身!此时List 的唯一元素就是这个数组。
ps:从两个数组转化为list,IDEA自动生成的实例化对象也可以观察到,Integer是List,而int的是List<int[]>,因此包装类型的list还是包装类型,而基本类型的list是放入了他对应的数组。
三. 该如何修改list的大小
我们来看下面一个例子:
Integer[] arr1= {1, 2, 3};List<Integer> list1 = Arrays.asList(arr1);list1.add(4);System.out.println(list1);
输出结果为:
Exception in thread "main" java.lang.UnsupportedOperationExceptionat java.util.AbstractList.add(AbstractList.java:148)at java.util.AbstractList.add(AbstractList.java:108)at com.test.main(test.java:17)
我们查看asList方法的描述,出现一句:
Returns a fixed-size list backed by the specified array.
意思是:返回由指定数组支持的固定大小列表。
接着查看asList方法调用的ArrayList()方法:
private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable
{private static final long serialVersionUID = -2764017481108945198L;private final E[] a;ArrayList(E[] array) {a = Objects.requireNonNull(array);}@Overridepublic int size() {return a.length;}//...
}
分析:
直接使用asList()生成的list固定了集合的大小,不能实现add,remove等操作。
原因在于asList调用了一个静态表内部类ArrayList,在这个内部类中有一个被声明为 final 的数组 a ,所有传入的元素都会被保存在这个数组 a 中。到此,谜底又揭晓了: asList 方法返回的确实是一个 ArrayList ,但这个 ArrayList 并不是 java.util.ArrayList ,而是 java.util.Arrays 的一个内部类。这个内部类用一个 final 数组来保存元素,因此用 asList 方法产生的 ArrayList 是不可修改大小的。
因此需要创建一个真正的List,
List list = new ArrayList<>(Arrays.asList(arr)),
在上面这段代码中,我们 new 了一个 java.util.ArrayList ,然后再把 asList 方法的返回值作为构造器的参数传入,最后得到的 myList 自然就是可以动态扩容的了。
四.总结
- asList()适用于将数组转化为list的一个工具类;
- asList()转化为数组最好是包装类型或者是引用类型的;
- asList()转化为数组时,最好创建一个真正的ArrayList,方便后续的add,remove等操作。
浅谈Arrays.asList()方法相关推荐
- 浅谈Arrays.asList()方法的使用
浅谈Arrays.asList()方法的使用 首先,该方法是将数组转化为list.有以下几点需要注意: (1)该方法不适用于基本数据类型(byte,short,int,long,float,doubl ...
- Unity iOS打开AppStore评星页面,浅谈Application.OpenURL()方法。
http://fairwoodgame.com/blog/?p=38 Unity iOS打开AppStore评星页面,浅谈Application.OpenURL()方法. Posted in Uni ...
- python类中方法的执行顺序-浅谈Python的方法解析顺序(MRO)
方法解析顺序, Method Resolution Order 从一段代码开始 考虑下面的情况: class A(object): def foo(self): print('A.foo()') cl ...
- Java Arrays.asList()方法详解
本文是对Arrays.asList()方法从源码角度进行分析,解析使用中的一些困惑. 首先看Arrays.asList()的源码 public static <T> List<T&g ...
- 浅谈 JSON.stringify 方法
原文:浅谈 JSON.stringify 方法 一.前言 最近项目中,遇到需要将对象转换成字符串进行传递,上次写过一篇文章关于json字符串转换成json对象,json对象转换成字符串,值转换成字符串 ...
- python方法解析顺序_浅谈Python的方法解析顺序(MRO)
方法解析顺序, Method Resolution Order 从一段代码开始 考虑下面的情况: class A(object): def foo(self): print('A.foo()') cl ...
- 中鸣循迹机器人_浅谈机器人设计方法
浅谈机器人设计方法 摘要: 机器人是人类完成智能化中非常重要的工具, 随着时代的发展, 机器 人已经在世界有了一定的发展,甚至很多国家机器人已经运用到实际的生活中 去. 而机器人的设计方法无疑是很多人 ...
- Arrays.asList方法总结
作用 : Arrays.asList() 将一个数组转化为一个List对象,这个方法会返回一个ArrayList类型的对象, 这个ArrayList类并非java.util.ArrayList类,而是 ...
- 正确认识Arrays.asList方法
Arrays工具类提供了一个方法asList, 使用该方法可以将一个变长参数或者数组转换成List . 其源代码如下: /*** Returns a fixed-size list backed by ...
最新文章
- ef连接mysql报root没有权限_想要远程连接MySQL,赋予root权限没用啊?一直报语法错误...
- 又拍云再放大招,CDN同时支持HTTP/2和SPDY/3.1协议
- I/O流。简单利用File.copy
- 如何创建启动界面Splash Screen
- mysql 分区表 归档_MySQL分区表
- 快速配置MPLS ×××
- 里工实业:用宜搭自主搭建MES系统,实现生产全流程管理
- Response.ContentType 详细列表
- 使用TensorFlow.js的AI聊天机器人五:创建电影对话聊天机器人
- ndarray 求和_numpy不同阶数张量相加问题(broadcast)
- 时间戳转为时间友好显示
- 赛尔原创 | ACL20 用于多领域端到端任务型对话系统的动态融合网络
- [poj] 1236 networks of schools
- 引发电气火灾火警的原因(转载)
- 计算机没有网络设备器,设备管理器里没有网络适配器的解决方法 - 系统家园
- segnet和unet区别_SegNet图像分割网络直观详解
- [整理]VS2010中文版配置opencv2.4.8
- 华米Zepp小程序开发入门
- 紫书刷题记录 UVa12100 打印队列
- win10 此电脑 网络位置 怎么删除
热门文章
- 中电科45家研究所:北上第一梯队,南京、成都、合肥和重庆第二梯队
- tea系列加密算法学习笔记
- 44000+ 人一夜之间失业:一拖二懒三不读书,不淘汰你淘汰谁?
- 微信小程序 —— 模块化方法的总结
- EBGP环回口邻居建立不了的原因
- onenote的笔记本在windows10保存的路径
- 如何解决缓存雪崩、击穿、穿透难题?
- c语言数据结构-遍历
- 牛客网_java选择题
- C发展史: KR C/C89/C99/C11 以及 C++发展史: C++98/C++03/C++11