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<String, List<String>> 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<String> 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"));
}
报错如下:
把序号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<? extends E> c),甚至iterator()方法都没有覆盖,也就是说上面的几个方法都可能在调用中报错,liuyh17211试了一下,只要不去修改list中的值,调用iterator()方法是没问题的。
由此可见JDK设计的这个返回List,只支持遍历和取值,不能做任何修改,只能作为传递值的桥梁。
使用List list = new ArrayList<>(map.get(“str1”));
进行添加修改操作