Collection集合中unmodifiableList使用及问题

        项目运行过程中,发现异常抛出 java.lang.UnsupportedOperationException。追踪源头之后发现是使用了集合类中 Collections.unmodifiableList 方法导致,下面就此问题对度娘发起了询问~

异常原因

1. 此集合方法返回的是一个只读集合,如果对此集合做其他操作就会抛出异常,查看源码后得知,此方法只实现了get方法,其他方法一律抛出异常,源码如下:

2. 可以看到,除了get方法,set、add、remove方法在调用时全部抛出UnsupportedOperationException异常。因为是大佬写的代码,咨询大佬后得知,如此设计是因为项目会生成一个报告,而这个报告中数据在产生后不可被修改的,所以使用了集合中的这个方法,来确保数据不会被修改。

如果想要再次对这个集合进行修改操作,可以在外部在包一层集合例 :Lists.newArrayList(Collections.unmodifiableList())

3. 同样的 Collections 集合类中的 unmodifiableMap()、unmodifiableSet()方法也是只读

 扩展部分:

在Arrays.asList() 及 Lists.asList() 中也是对返回的集合不可修改,而两者又有一些不同。

Arrays是数组工具类,asList()方法可以将数组转为List集合。其继承父类为AbstractList,其内部实现了 get()、set()方法,其余继承父类中的方法,Arrays源码为:

父类 AbstractList 源码为:

 可以看到除了重新实现的,其他返回抛出异常。而 Lists.asList() 中的实现类同样继承AbstractList,但它只实现了get()方法,其余方法使用父类中方法,感兴趣的可以看看源码~

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值