美文网首页
Arrays.asList(T... a)方法的坑

Arrays.asList(T... a)方法的坑

作者: 汪和呆喵 | 来源:发表于2018-11-30 10:15 被阅读0次

踩了一个小坑,今天记录下来

先看代码吧

    public static void main(String args[]) {
        String toRemove = "bb";
        String[] s = new String[]{"aa",toRemove,"cc","dd"};
        List<String> sList = Arrays.asList(s);
        sList.remove(toRemove);
    }

会有问题吗?
很遗憾,remove这行会直接抛出异常

Exception in thread "main" java.lang.UnsupportedOperationException at java.util.AbstractList.remove(AbstractList.java:161) at java.util.AbstractList$Itr.remove(AbstractList.java:374) at java.util.AbstractCollection.remove(AbstractCollection.java:293)

使用工具类 Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,
它的 add/remove/clear 方法会抛出 UnsupportedOperationException 异常。

为什么

看Arrays.java源码

    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
他是Arrays类里定义的一个内部类
很遗憾 并没有实现集合的修改方法,这里调用remove将直接调用父类AbstractList的remove方法。

    public E remove(int index) {
        throw new UnsupportedOperationException();
    }

Arrays.asList
体现的是适配器模式,只是转换接口,后台的数据仍是数组。

相关文章

网友评论

      本文标题:Arrays.asList(T... a)方法的坑

      本文链接:https://www.haomeiwen.com/subject/tquccqtx.html