一个Arrays.asList()基本的用法:

String[] str = new String[]{"1","2","3"};
ArrayList al = new ArrayList(Arrays.asList(str));//将数组元素添加到集合的一种快捷方式

有时候这样使用就有可能出现问题:

String[] str = new String[]{"1","2","3"};
List aslist = Arrays.asList(str);

aslist是List类型的对象,但是调用List接口的方法的时候会出错就像这样:

aslsit.add("4");
Exception in thread "main" java.lang.UnsupportedOperationExceptionat java.util.AbstractList.add(Unknown Source)at java.util.AbstractList.add(Unknown Source)at test.LinkedListTest.main(LinkedListTest.java:13)

出现这个错误的原因是没有定义add()方法的具体实现,这些异常都在AbstractList抛出,看一下Arrays源码:

@SafeVarargs
public static <T> List<T> asList(T... a) {return new ArrayList<>(a);
}

没有问题啊,返回的是一个ArrayList,但是这个ArrayList不是ArrayList.class而是Arrays$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) {if (array==null)throw new NullPointerException();a = array;}public int size() {return a.length;}public Object[] toArray() {return a.clone();}public <T> T[] toArray(T[] a) {int size = size();if (a.length < size)return Arrays.copyOf(this.a, size,(Class<? extends T[]>) a.getClass());System.arraycopy(this.a, 0, a, 0, size);if (a.length > size)a[size] = null;return a;}public E get(int index) {return a[index];}public E set(int index, E element) {E oldValue = a[index];a[index] = element;return oldValue;}public int indexOf(Object o) {if (o==null) {for (int i=0; i<a.length; i++)if (a[i]==null)return i;} else {for (int i=0; i<a.length; i++)if (o.equals(a[i]))return i;}return -1;}public boolean contains(Object o) {return indexOf(o) != -1;}}

这个内部类中并没有实现list的一些方法,所以调用add(),remove()这些方法都会出现错误。

这个内部类中有一个泛型的数组private final E[] a,所以Arrays.asList返回的集合中的数组其实是有具体的类型的,而不是Object[]。

相当于List<String> list = new Arrays$ArrayList<String>();

但是有类型的数组在转换过程中就会出现某些问题,有个Bug就是这样引起的。具体见 《c.toArray might not return Object[]》。  

  

转载于:https://www.cnblogs.com/liqing-weikeyuan/p/7919720.html

Arrays.asList( ) 返回一个特殊的“ArrayList”相关推荐

  1. Arrays.asList()返回的ArrayList,这是Arrays里内嵌的一个私有静态类,而并不是java.util.ArrayList类

    测试代码: package array;import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; ...

  2. java中的asList_Java中的Arrays.asList()方法

    Arrays.asList()返回一个List,但是这种情况下,其底层的实现是一个final数组,因此不能调整其尺寸 如下代码片段: package chapter11.t1; import java ...

  3. Arrays.asList的使用

    一.java.util.Arrays.asList() 的一般用法 如果将一个数组转换为 List,可以将需要转化的数组作为参数,或者直接把数组元素作为参数.但是其中参数必须是包装类类型,如果使用的是 ...

  4. Arrays.asList

    一般情况下,使用Arrays.asList()的原因无非是想将数组或一些元素转为集合,而你得到的集合并不一定是你想要的那个集合. asList在最初设计时用于打印数组,但jdk1.5开始,有了另一个比 ...

  5. java基础 --- Arrays.asList():返回指定数组支持的固定大小列表

    Arrays.asList():返回指定数组支持的固定大小列表 首先看下这个方法的源码注释,注意第一句,Returns a fixed-size list backed by the specifie ...

  6. ArrayList.subList() VS Arrays.asList :创业更比守业难?

    2021年7月12日张近东辞去苏宁董事长并提名张康阳为非独立董事.张近东的黯然退场犹如2017年的王健林.那么在时代更迭的过程中,他们的儿子又会以怎样的姿态立住脚跟? 王思聪和张康阳就像一个班级里的坏 ...

  7. java数组转list(Arrays .asList)

    习惯性的错误代码: Integer[] intArr = {1,2,3}; List<Integer> lst = Arrays .asList(intArr); lst.add(4); ...

  8. Arrays.asList()使用时的注意事项,这个结论同可适用于Stream.of()___Arrays.stream和Stream.of

    Arrays.asList()使用时的注意事项,这个结论同可适用于Stream.of() Arrays.asList的参数不能是基本数据类型的数组 Array.asList()的作用是把数组变成一个列 ...

  9. java集合类的一些总结——Arrays.asList和Guava操作集合

    使用背景 总结一下最近项目中使用到集合的两个点,一个是Arrays.asList这个方法使用的坑,另一个是利用Guava的Sets工具类去求并交集. 使用总结 Arrays.asList的坑 先上结论 ...

  10. java中的asList_java中的Arrays.asList()浅析

    1.Arrays.asList(T..)使用的是静态内部类:ArrayList, (没有定义add和remove等一些方法),而不是java.util.ArrayList /** * 1.测试Arra ...

最新文章

  1. 产品经理必了解的3个app技术框架
  2. xcode 学习笔记2:动态添加view
  3. mysql算大型数据库吗_mysql – 估计大型数据库的大小和速度
  4. 无人驾驶全局路径规划之RRT算法
  5. Oracle 文字排序,按照拼音,姓氏笔画等
  6. Vultr VPS如何修改root密码
  7. 正文 第二章 通背拳
  8. 三分钟教会你微信炸一炸,满屏粑粑也太可爱了!
  9. debian修改字体
  10. Centos7 下搭建小幺鸡接口管理工具
  11. 上兵伐谋,其次伐交,其次伐兵,其下攻城
  12. nginx代理MySQL实现数据库远程办公
  13. sqlite怎么转换mysql_Django如何把SQLite数据库转换为Mysql数据库
  14. Vue的localStorage缓存遗留问题
  15. 软件工程作业二——结对编程(用HTML5搭建3D俄罗斯方块)
  16. 【入门数据分析】英国某电商的销售分析
  17. 2021年博士研究生招生大概率延期举行
  18. 计算机毕业设计Java二手交易网站(源码+系统+mysql数据库+lW文档)
  19. 工作感悟:初识产品经理
  20. 解构「私域流量」(二)|如何构建微信私域闭环?

热门文章

  1. 关于利用exchange server 2003搭建邮件服务器:小进步……
  2. Rhel6-piranha配置文档
  3. 快切-开源中文css框架之纯css透明
  4. [转]EVC++开发实例之浏览器窗口(by fllsoft)
  5. 今天又感受到了编程的乐趣
  6. mysql sqrt_详解MySQL中的SQRT函数的使用方法
  7. mysql连接教程_MySQL 连接
  8. 30天自制操作系统之叠加处理
  9. java中连接数据库
  10. 文件服务器php源码,php 在服务器上载文件