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<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”));
进行添加修改操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值