一.引言:
实际操作中,我们会遇到需要将数组转化为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 自然就是可以动态扩容的了。

四.总结

  1. asList()适用于将数组转化为list的一个工具类;
  2. asList()转化为数组最好是包装类型或者是引用类型的;
  3. asList()转化为数组时,最好创建一个真正的ArrayList,方便后续的add,remove等操作。

浅谈Arrays.asList()方法相关推荐

  1. 浅谈Arrays.asList()方法的使用

    浅谈Arrays.asList()方法的使用 首先,该方法是将数组转化为list.有以下几点需要注意: (1)该方法不适用于基本数据类型(byte,short,int,long,float,doubl ...

  2. Unity iOS打开AppStore评星页面,浅谈Application.OpenURL()方法。

    http://fairwoodgame.com/blog/?p=38 Unity iOS打开AppStore评星页面,浅谈Application.OpenURL()方法. Posted in  Uni ...

  3. python类中方法的执行顺序-浅谈Python的方法解析顺序(MRO)

    方法解析顺序, Method Resolution Order 从一段代码开始 考虑下面的情况: class A(object): def foo(self): print('A.foo()') cl ...

  4. Java Arrays.asList()方法详解

    本文是对Arrays.asList()方法从源码角度进行分析,解析使用中的一些困惑. 首先看Arrays.asList()的源码 public static <T> List<T&g ...

  5. 浅谈 JSON.stringify 方法

    原文:浅谈 JSON.stringify 方法 一.前言 最近项目中,遇到需要将对象转换成字符串进行传递,上次写过一篇文章关于json字符串转换成json对象,json对象转换成字符串,值转换成字符串 ...

  6. python方法解析顺序_浅谈Python的方法解析顺序(MRO)

    方法解析顺序, Method Resolution Order 从一段代码开始 考虑下面的情况: class A(object): def foo(self): print('A.foo()') cl ...

  7. 中鸣循迹机器人_浅谈机器人设计方法

    浅谈机器人设计方法 摘要: 机器人是人类完成智能化中非常重要的工具, 随着时代的发展, 机器 人已经在世界有了一定的发展,甚至很多国家机器人已经运用到实际的生活中 去. 而机器人的设计方法无疑是很多人 ...

  8. Arrays.asList方法总结

    作用 : Arrays.asList() 将一个数组转化为一个List对象,这个方法会返回一个ArrayList类型的对象, 这个ArrayList类并非java.util.ArrayList类,而是 ...

  9. 正确认识Arrays.asList方法

    Arrays工具类提供了一个方法asList, 使用该方法可以将一个变长参数或者数组转换成List . 其源代码如下: /*** Returns a fixed-size list backed by ...

最新文章

  1. ef连接mysql报root没有权限_想要远程连接MySQL,赋予root权限没用啊?一直报语法错误...
  2. 又拍云再放大招,CDN同时支持HTTP/2和SPDY/3.1协议
  3. I/O流。简单利用File.copy
  4. 如何创建启动界面Splash Screen
  5. mysql 分区表 归档_MySQL分区表
  6. 快速配置MPLS ×××
  7. 里工实业:用宜搭自主搭建MES系统,实现生产全流程管理
  8. Response.ContentType 详细列表
  9. 使用TensorFlow.js的AI聊天机器人五:创建电影对话聊天机器人
  10. ndarray 求和_numpy不同阶数张量相加问题(broadcast)
  11. 时间戳转为时间友好显示
  12. 赛尔原创 | ACL20 用于多领域端到端任务型对话系统的动态融合网络
  13. [poj] 1236 networks of schools
  14. 引发电气火灾火警的原因(转载)
  15. 计算机没有网络设备器,设备管理器里没有网络适配器的解决方法 - 系统家园
  16. segnet和unet区别_SegNet图像分割网络直观详解
  17. [整理]VS2010中文版配置opencv2.4.8
  18. 华米Zepp小程序开发入门
  19. 紫书刷题记录 UVa12100 打印队列
  20. win10 此电脑 网络位置 怎么删除

热门文章

  1. 中电科45家研究所:北上第一梯队,南京、成都、合肥和重庆第二梯队
  2. tea系列加密算法学习笔记
  3. 44000+ 人一夜之间失业:一拖二懒三不读书,不淘汰你淘汰谁?
  4. 微信小程序 —— 模块化方法的总结
  5. EBGP环回口邻居建立不了的原因
  6. onenote的笔记本在windows10保存的路径
  7. 如何解决缓存雪崩、击穿、穿透难题?
  8. c语言数据结构-遍历
  9. 牛客网_java选择题
  10. C发展史: KR C/C89/C99/C11 以及 C++发展史: C++98/C++03/C++11