阿里巴巴Java开发规范说到使用工具类Arrays.asList()方法把数组转换成集合时,不能使用其修改集合相关的方法。

因为它的add/remove/clear方法会抛出UnsupportedOperationException(),我们来看一下为什么会出现这种情况。

问题分析 

我们做个测试:

public static void main(String[] args) {List<String> list = Arrays.asList("a", "b", "c");// list.clear();// list.remove("a");// list.add("g");
}

被注释的三行可以分别解开注释,运行后确实出现了规约中所说的异常。我们来看下Arrays.asList()做了什么操作。

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

看上去是个很正常的方法,然而实际上你点进到ArrayList发现,其实ArrayList并不是我们平时用的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;}@Overridepublic Object[] toArray() {return a.clone();}@Override@SuppressWarnings("unchecked")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;}// 后面省略了

而是Arrays里面的一个内部类。

而且这个内部类没有add,clear,remove方法,所以抛出的异常其实来自于AbstractList。

public void add(int index, E element) {throw new UnsupportedOperationException();
}public E remove(int index) {throw new UnsupportedOperationException();
}

点进去就会发现抛出异常的地方,clear底层也会调用到remove所以也会抛出异常。

总结

1、Arrays.asList()不要乱用,底层其实还是数组。

2、如果使用了Arrays.asList()的话,最好不要使用其集合的操作方法。

3、List list = new ArrayList<>(Arrays.asList("a", "b", "c"))可以在外面这样包一层真正的ArrayList。

数组转集合有很多方式,可以参考链接:

https://stackoverflow.com/questions/157944/create-arraylist-from-array

作者:我想问问天

juejin.im/post/5d10e52ee51d454f6f16ec11

猜你喜欢

1、GitHub 标星 3.2w!史上最全技术人员面试手册!FackBoo发起和总结

2、如何才能成为优秀的架构师?

3、从零开始搭建创业公司后台技术栈

4、程序员一般可以从什么平台接私活?

5、37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...

6、滴滴业务中台构建实践,首次曝光

7、不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事

8、15张图看懂瞎忙和高效的区别!

你知道Arrays.asList 有坑吗?千万别踩啊!相关推荐

  1. Arrays.asList()避坑指南

    1. Arrays.asList() 该方法是将数组转化成List集合的方法. List<String> list = Arrays.asList("a"," ...

  2. Arrays.asList()的坑

    Arrays.asList()产生的ArrayList并不是集合包下的的ArrayList,而是实现在Arrays类中的内部类ArrayList,该类并未重写remove()方法,因此Arrays.a ...

  3. 【Java】Arrays.asList 有坑

    1.概述 阿里巴巴Java开发规范说到使用工具类Arrays.asList()方法把数组转换成集合时,不能使用其修改集合相关的方法. 因为它的add/remove/clear方法会抛出Unsuppor ...

  4. C/C++之QT攻略——在QT中容易遇到的那些坑,千万别踩了!

    (1)QUdpSocket接收数据 进入槽后,要用这种方式读取,否则可能会导致不发readyRead()信号 . while(udpSocket->bytesAvailable()) { udp ...

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

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

  6. Java集合工具类的一些坑,Arrays.asList()、Collection.toArray()...

    Arrays.asList() 使用指南 最近使用Arrays.asList()遇到了一些坑,然后在网上看到这篇文章:Java Array to List Examples 感觉挺不错的,但是还不是特 ...

  7. 通过Arrays.asList数组转为集合的坑

    首先定义一个int类型的数组 int[] arr = {1,2,3};// 将数组转为集合并输出List<int[]> ints = Arrays.asList(arr);System.o ...

  8. 使用Arrays.asList、ArrayList的subList时,你有踩过这些坑吗?

    前沿技术早知道,弯道超车有希望 积累超车资本,从关注DD开始 作者:申城异乡人, 图文编辑:xj 来源:https://blog.csdn.net/zwwhnly/article/details/10 ...

  9. java stream toarray_Java集合工具类的一些坑,Arrays.asList()、Collection.toArray()...

    Arrays.asList() 使用指南 最近使用Arrays.asList()遇到了一些坑,然后在网上看到这篇文章:Java Array to List Examples 感觉挺不错的,但是还不是特 ...

  10. java 是否含有日文_Java踩坑记系列之Arrays.asList

    阅读本文大概需要6分钟 1. java.util.Arrays.asList()可以方便的把一个数组转成ArrayList集合来使用,但是如果对集合使用增加或删除元素的操作将会报错,如下: List ...

最新文章

  1. New Phytologist:王建军等综述全球变化下的山地微生物组和生态系统功能
  2. Enable htaccess file work in Apache
  3. 一种新方法或让AI模型拥有“联想”力,或能识别从未见过的事物
  4. procexp.exe中文版---Process Explorer 进程监视V11.21中文版
  5. 把字符串里的整数倒叙一个一个打印出来
  6. 算法谜题 php,JavaScript实现N皇后问题算法谜题解答_javascript技巧
  7. 14-Providing protection for complex software
  8. windows主机加固和评测
  9. 设计模式学习(三)——装饰器模式
  10. Oracle:使用ASM自动存储管理, 严重推荐
  11. 【转】ABP源码分析三十五:ABP中动态WebAPI原理解析
  12. android view 点击变暗,Android应用开发Android ImageView点击变暗效果
  13. node ajax validator,node/express 4:在ajax post上使用express-validator显示错误
  14. 无法删除所有指定的值_SQL-插入、更新、删除、创建
  15. php 内存池,内存详解: 详解PHP内存池中的存储层_php
  16. Mongo, Express, Angular, Node-- MEAN Stack搭建
  17. 查询正在使用的用户(删除用户时)
  18. Java图形界面编程--漫天繁星
  19. 智能运维 | 六度亮剑SREcon,百度引领智能运维新风向
  20. ENVI中操作出现Error :array dimensions must be greater than 0错误的解决方法

热门文章

  1. 简述Python类中的 __init__、__new__、__call__ 方法
  2. Mathematica 计算矩阵的伴随矩阵
  3. iOS开发多线程篇---线程间的通信
  4. sed的选项与命令简要
  5. IpV6 linux RedHat5
  6. UNIX环境高级编程之第4章:文件和目录
  7. Patternodes 3 for Mac(创建图形矢量模式工具)
  8. 新手如何检查MacBook电池的运行状况
  9. 苹果电脑如何正确断网?macOS操作系统断网方法
  10. 更新:第6章已上线!最酷的程序员应该知道的【LLVM】!