美文网首页
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