Arrays.asList返回的List与new ArrayList的区别 map.get("").add("");

Arrays.asList返回的List与new ArrayList的区别 map.get("").add("");

原文地址:https://www.oschina.net/question/3029372_2304812
https://www.cnblogs.com/liuyh17211/p/3250365.html (源码过程,总结)

public static void main(String[] args) {
    Map> map = new HashMap<>();
    map.put("str1", Arrays.asList("aa","bb"));
    System.out.println(map.get("str1"));

    map.get("str1").add("cccc");  // 1 此处报错
    System.out.println(map.get("str1"));

    ***List list = new ArrayList<>(map.get("str1"));***
    list.add("dddd"); // 2 正常添加
    map.put("str1",list);
    System.out.println(map.get("str1"));

    map.get("str1").add("cccc"); // 3 正常修改
    System.out.println(map.get("str1"));

}

报错如下:
Arrays.asList返回的List与new ArrayList的区别 map.get(
把序号1 屏蔽后结果:正常
在这里插入图片描述

总结:
可以发现,这个类确实没有覆盖父类的实现,所以才报错,那还有哪些方法是不支持的呢,在AbstractList中,明确提到了不覆盖就会抛UnsupportedOperationException异常的方法有3个:

add(int index, E element),
set(int index, E element),
remove(int index)。

而上面的代码中只覆盖了set方法,可能会调用这几个方法的add(E element),clear(),addAll(int index, Collection c),甚至iterator()方法都没有覆盖,也就是说上面的几个方法都可能在调用中报错,liuyh17211试了一下,只要不去修改list中的值,调用iterator()方法是没问题的。
由此可见JDK设计的这个返回List,只支持遍历和取值,不能做任何修改,只能作为传递值的桥梁。

使用List list = new ArrayList<>(map.get(“str1”));
进行添加修改操作

你可能感兴趣的:(Arrays.asList返回的List与new ArrayList的区别 map.get("").add("");)