美文网首页
Arrays.asList()方法/适配器模式

Arrays.asList()方法/适配器模式

作者: 烛火下的乌托邦丶 | 来源:发表于2018-12-09 14:53 被阅读0次

    使用工具类Arrays.asList()方法可以很方便的把数组转换成集合
    但是转换后不能使用集合修改的相关方法 add/remove/clear等...
    它的 add / remove / clear 方法会抛出 UnsupportedOperationException 异常。
    asList 的返回对象是一个 Arrays 内部类,并没有实现集合的修改方法。 Arrays . asList
    体现的是适配器模式,只是转换接口,后台的数据仍是数组。

    Arrays.asList()的源码

    @SafeVarargs
    @SuppressWarnings("varargs")
    public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }
    
    • 继续看new ArrayList<>(a[])的源码
    ArrayList(E[] array) {
        a = Objects.requireNonNull(array);
    }
    
    • 可以看到,它只是判断了一下array是否为null,然后直接把array的地址用 = 赋值给了a
    • 所以,如果后面更改子列表的值,那么原数组的值也会发生变化哦
    • 但是,后面对原列表的增加或删除,均会导致子列表的增加删除产生 ConcurrentModificationException异常
      所以尽量不要在使用asList以后还去操作原列表
    String[] str = new String[] { "you", "wu" };
    List list = Arrays.asList(str);
    第一种情况: list.add("yangguanbao");  运行时异常。
    第二种情况: str[0] = "gujin"; 那么 list.get(0) 也会随之修改。
    

    相关文章

      网友评论

          本文标题:Arrays.asList()方法/适配器模式

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