Arrays.asList 有坑,千万别踩!

Arrays.asList 有坑,千万别踩!

作者:我想问问天

juejin.im/post/5d10e52ee51d454f6f16ec11

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

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

问题分析

我们做个测试:

public static void main(String[] args) {

List list = Arrays.asList("a", "b", "c");

// list.clear();

// list.remove("a");

// list.add("g");

}

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

public static List asList(T... a) {

return new ArrayList<>(a);

}

看上去是个很正常的方法,然而实际上你点进到ArrayList发现,其实ArrayList并不是我们平时用的ArrayList。

private static class ArrayList extends AbstractList

implements RandomAccess, java.io.Serializable

{

private static final long serialVersionUID = -2764017481108945198L;

private final E[] a;

ArrayList(E[] array) {

a = Objects.requireNonNull(array);

}

@Override

public int size() {

return a.length;

}

@Override

public Object[] toArray() {

return a.clone();

}

@Override

@SuppressWarnings("unchecked")

public T[] toArray(T[] a) {

int size = size();

if (a.length < size)

return Arrays.copyOf(this.a, size,

(Class) 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

推荐去我的博客阅读更多:

1.Java JVM、集合、多线程、新特性系列教程

2.Spring MVC、Spring Boot、Spring Cloud 系列教程

3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

4.Java、后端、架构、阿里巴巴等大厂最新面试题

觉得不错,别忘了点赞+转发哦!

相关推荐

形塑当下,形塑艺术:不断进化的中国电影审查制度
365bet体育在线投注

形塑当下,形塑艺术:不断进化的中国电影审查制度

📅 10-21 👁️ 6438
多比特游戏旗下产品下载
365bet体育在线投注

多比特游戏旗下产品下载

📅 09-22 👁️ 9047
售前办公软件有哪些类型
365bet体育在线投注

售前办公软件有哪些类型

📅 10-15 👁️ 6192
从零到完美:揭秘UI设计一张界面所需的平均时间与关键要素
云南前十名的影楼有哪些
365bet体育在线投注

云南前十名的影楼有哪些

📅 07-16 👁️ 2784
小米5c跑分多少?
365bet体育在线投注

小米5c跑分多少?

📅 10-29 👁️ 7695
[分享]DNF端游周年庆版本更新物价后的最新部分搬砖热门地图收益排行表
瀛有什么深意(瀛字五行属什么)
office365无法打开word

瀛有什么深意(瀛字五行属什么)

📅 07-05 👁️ 8867
属猴今日运势2025.9.27
best365官网手机版

属猴今日运势2025.9.27

📅 09-27 👁️ 1970
狼人杀经典角色大盘点成为狼人杀高手 15个角色介绍及技巧 轻松掌握狼人杀游戏规则
kakao服务器fpp模式为什么玩不了
365bet体育在线投注

kakao服务器fpp模式为什么玩不了

📅 08-13 👁️ 2066
'喇'字用粤语广东话点读(怎么读)
365bet体育在线投注

'喇'字用粤语广东话点读(怎么读)

📅 08-29 👁️ 4581