1.概述

阿里巴巴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所以也会抛出异常。

2.总结

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

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

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

【Java】Arrays.asList 有坑相关推荐

  1. Java Arrays.asList注意事项

    Arrays.asList用来将数组转化为List,这个看似功能很明了的方法却暗藏玄机. 请先看下面的程序: int[] datas = new int[]{1,2,3,4,5}; List list ...

  2. Arrays.asList()避坑指南

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

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

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

  4. java arrays.aslist(),Arrays.asList使用指南

    在网上发现一篇讲解 Arrays.asList 用法的好文章:Java Array to List Examples,我把文章要点整理如下,并加上一些个人见解,恳请各位看官斧正. 一.java.uti ...

  5. java arrays.aslist()_Java中Arrays.asList()方法详解及实例

    Arrays.asList() 是将数组作为列表. 问题来源于: public class Test { public static void main(String[] args) { int[] ...

  6. Arrays.asList()的坑

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

  7. 【Java】java Arrays.asList 在idea 下 debug 不同结果的表现 非常诡异 胆小勿入

    本文为博主九师兄(QQ:541711153 欢迎来探讨技术)原创文章,未经允许博主不允许转载.有问题可以先私聊我,本人每天都在线,会帮助需要的人. 文章目录 1.概述 1.概述 是这样的我写了一段代码 ...

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

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

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

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

最新文章

  1. 即将 50 岁的雷军,重新回到手机战场
  2. 转: mysql create view 创建视图
  3. android中edittext设置密码格式,Android 自定义EditText(带清理、密码可见、不可见)...
  4. airdroid黑屏_如何使用AirDroid从PC控制Android设备
  5. 记一次win10下pycharm用tensorboard可视化不显示的问题解决
  6. KD树(k-d tree)
  7. 根据域名实现前端主题换肤的解决方案
  8. listview的简单实现
  9. Linux编程(2)_软件的安装和卸载
  10. PL-SVO: Semi-Direct Monocular Visual Odometry by Combining Points and Line Segments
  11. 写在WinHEC开幕之际:沿着Windows我们一路走来
  12. 基于springboot的疫情网课教学平台
  13. 【无标题】java班级管理系统
  14. 大数据视频资源——尚硅谷大数据视频地址
  15. 小程序Progress组件介绍
  16. python绘制箭头_python如何绘制坐标箭头?
  17. 【巴比特前端校招+笔试/一面/二面】
  18. C语言 字符串解析strchr/strrchr/strtok//strtok_r函数使用
  19. DO=MOSI DI=MISO
  20. 从今起,我蹲马步,苦练基本功

热门文章

  1. 坚决拥护苹果!三星Galaxy S21系列发布:多支笔,充电器耳机却没了
  2. 全新液体镜头专利曝光:华为P50系列拍照对焦速度堪比人眼
  3. 这一项经典功能即将回归!手机厂商们都后悔了...
  4. 雷军正式入驻B站,或为小米新品直播带货做准备
  5. iPhone第二季度在美销量降23%,但iPhone SE有亮点
  6. Redmi 9或搭载联发科Helio G80:内置5000mAh电池 支持NFC
  7. 华为Mate40 Pro渲染图曝光:刘海和瀑布屏一起消失
  8. 又是安卓玩剩下的功能!下代iPhone或可同时连两副耳机
  9. 苹果指控高通从事非法专利授权活动 索赔最高270亿美元
  10. 章泽天卸任刘强东旗下一公司董事