Arrays.asList 存在的坑
来源:juejin.im/post/5d10e52ee51d454f6f16ec11
引语:
阿里巴巴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);
}
@Override
public int size() {
return a.length;
}
@Override
public 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所以也会抛出异常。
总结:
Arrays.asList()不要乱用,底层其实还是数组。
如果使用了Arrays.asList()的话,最好不要使用其集合的操作方法。
List list = new ArrayList<>(Arrays.asList("a", "b", "c"))可以在外面这样包一层真正的ArrayList。
数组转集合有很多方式,可以参考链接:
https://stackoverflow.com/questions/157944/create-arraylist-from-array
如果觉得文章对你有帮助,可以转发给更多的小伙伴~
(完)
OK,接下来到了福利的时间了,首先公布一下昨日被选中的朋友:杉杉来了、 会飞的狗、Bony、Zy'、Alpaca、达利雅、楚七妤、瑜、小生不才°、少阳、小逆、#include{*有何不可*}、Viola、然后呢、殘玥-、琁玥、yyspencil、?奋斗?小青年?、坚定信念、善良的坏人最可怕、等待戈多、笑迎人生、laughing、roger、NERI、h正、Nono、映雪囊萤、左岸,右转。、?并亲了你一下?慧慧、平安、Peace、chengzi、.、毅念、灯芯、天薏、眴、猫布、多情、随缘、好吗好的、烟寒、凯、Devil、念天地之悠悠,独怆然而泣下、我是一只咸鱼、road can fly、Cassiel澈丹、Lynn、天生是 刺头!、哈。这些朋友请加我微信领取红包。(备注:红包。我中午或者晚上统一发射)。
老规矩:在留言区选50位,50元红包。我尽量多照顾到一些朋友,虽然红包金额不多,但是比平时抢红包的几毛钱还是多的,大家可以一起乐呵。
留言之后我会把你的留言放出来,大家不要全部过来问我是不是被选中了哈,我在第明天会公布结果的。只要你在明天公布的名单内就来找我要红包即可(越走心越容易被选中),就这么简单!
每天过来坐坐,看看文章,领领红包,交交朋友!今日话题是:你们平时在开发时都遇到哪些坑?欢迎讨论!(明天公布选择结果)。
关注我
程序员私房菜
看文章 * 领福利
点赞是最大的支持
- Arrays类--Arrays.asList方法的使用及注意
- 使用Collections.addAll还是Arrays.asList生成List,当修改原始数据时,均会影响到List里的数据
- java Arrays.asList com.google.common.collect.Lists.newArrayList 效率问题
- Arrays.asList()方法的使用
- 提高你的Java代码质量吧:避免基本类型数组转换列表陷阱(Arrays.asList())
- 数组转换为List(Arrays.asList)后add或remove出现UnsupportedOperationException
- Arrays.asList()
- Java Arrays.asList注意事项
- Arrays.asList(T...a)的使用问题
- Arrays.asList方法总结
- Arrays.asList方法返回的List不能执行add、remove操作
- Arrays.asList使用注意
- Arrays.asList方法的漏洞
- Arrays.asList方法总结
- Arrays.asList()把数组转换成集合
- Java初学习 - Arrays.asList方法总结
- java——Arrays.asList()方法
- Java Arrays.asList 实例
- Arrays.asList()引起的java.lang.UnsupportedOperationException
- Arrays.asList()