Collection集合中unmodifiableList使用及问题

Java 专栏收录该内容
8 篇文章 0 订阅

        项目运行过程中,发现异常抛出 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
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

西酉醋

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值