【Java】Arrays.asList 有坑
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 有坑相关推荐
- Java Arrays.asList注意事项
Arrays.asList用来将数组转化为List,这个看似功能很明了的方法却暗藏玄机. 请先看下面的程序: int[] datas = new int[]{1,2,3,4,5}; List list ...
- Arrays.asList()避坑指南
1. Arrays.asList() 该方法是将数组转化成List集合的方法. List<String> list = Arrays.asList("a"," ...
- Java Arrays.asList()方法详解
本文是对Arrays.asList()方法从源码角度进行分析,解析使用中的一些困惑. 首先看Arrays.asList()的源码 public static <T> List<T&g ...
- java arrays.aslist(),Arrays.asList使用指南
在网上发现一篇讲解 Arrays.asList 用法的好文章:Java Array to List Examples,我把文章要点整理如下,并加上一些个人见解,恳请各位看官斧正. 一.java.uti ...
- java arrays.aslist()_Java中Arrays.asList()方法详解及实例
Arrays.asList() 是将数组作为列表. 问题来源于: public class Test { public static void main(String[] args) { int[] ...
- Arrays.asList()的坑
Arrays.asList()产生的ArrayList并不是集合包下的的ArrayList,而是实现在Arrays类中的内部类ArrayList,该类并未重写remove()方法,因此Arrays.a ...
- 【Java】java Arrays.asList 在idea 下 debug 不同结果的表现 非常诡异 胆小勿入
本文为博主九师兄(QQ:541711153 欢迎来探讨技术)原创文章,未经允许博主不允许转载.有问题可以先私聊我,本人每天都在线,会帮助需要的人. 文章目录 1.概述 1.概述 是这样的我写了一段代码 ...
- java集合类的一些总结——Arrays.asList和Guava操作集合
使用背景 总结一下最近项目中使用到集合的两个点,一个是Arrays.asList这个方法使用的坑,另一个是利用Guava的Sets工具类去求并交集. 使用总结 Arrays.asList的坑 先上结论 ...
- Java集合工具类的一些坑,Arrays.asList()、Collection.toArray()...
Arrays.asList() 使用指南 最近使用Arrays.asList()遇到了一些坑,然后在网上看到这篇文章:Java Array to List Examples 感觉挺不错的,但是还不是特 ...
最新文章
- 即将 50 岁的雷军,重新回到手机战场
- 转: mysql create view 创建视图
- android中edittext设置密码格式,Android 自定义EditText(带清理、密码可见、不可见)...
- airdroid黑屏_如何使用AirDroid从PC控制Android设备
- 记一次win10下pycharm用tensorboard可视化不显示的问题解决
- KD树(k-d tree)
- 根据域名实现前端主题换肤的解决方案
- listview的简单实现
- Linux编程(2)_软件的安装和卸载
- PL-SVO: Semi-Direct Monocular Visual Odometry by Combining Points and Line Segments
- 写在WinHEC开幕之际:沿着Windows我们一路走来
- 基于springboot的疫情网课教学平台
- 【无标题】java班级管理系统
- 大数据视频资源——尚硅谷大数据视频地址
- 小程序Progress组件介绍
- python绘制箭头_python如何绘制坐标箭头?
- 【巴比特前端校招+笔试/一面/二面】
- C语言 字符串解析strchr/strrchr/strtok//strtok_r函数使用
- DO=MOSI DI=MISO
- 从今起,我蹲马步,苦练基本功
热门文章
- 坚决拥护苹果!三星Galaxy S21系列发布:多支笔,充电器耳机却没了
- 全新液体镜头专利曝光:华为P50系列拍照对焦速度堪比人眼
- 这一项经典功能即将回归!手机厂商们都后悔了...
- 雷军正式入驻B站,或为小米新品直播带货做准备
- iPhone第二季度在美销量降23%,但iPhone SE有亮点
- Redmi 9或搭载联发科Helio G80:内置5000mAh电池 支持NFC
- 华为Mate40 Pro渲染图曝光:刘海和瀑布屏一起消失
- 又是安卓玩剩下的功能!下代iPhone或可同时连两副耳机
- 苹果指控高通从事非法专利授权活动 索赔最高270亿美元
- 章泽天卸任刘强东旗下一公司董事