Java集合操作:UnsupportedOpertionExcepion产生的原因以及解决办法
问题产生:java.lang.UnsupportedOperationException
问题定位:在通过mybatis获取分页列表的时候写了下面这段代码
1 //分页获取列表 2 PageResult<InsuranceBeneficiaryDO> pageList = this.insuranceBeneficiaryDAO.getList(beneficiaryListBO); 3 4 List<InsuranceBeneficiaryDO> insuredList = pageList.getData(); 5 6 insuredList.add(0, applicantDO); 7 8 ... 9 public PageResult<InsuranceBeneficiaryDO> getList(BeneficiaryListBO beneficiaryListBO) { 10 LambdaQueryWrapper<InsuranceBeneficiaryDO> beneficiaryQueryWrapper = new LambdaQueryWrapper<>(); 11 12 beneficiaryQueryWrapper.eq(InsuranceBeneficiaryDO::getCurrentUserId, beneficiaryListBO.getUserId()) 13 .eq(InsuranceBeneficiaryDO::getIsApplicant, YesnoEnum.NO.getType()) 14 .eq(InsuranceBeneficiaryDO::getIsDelete, YesnoEnum.NO.getType()) 15 .like(Objects.nonNull(beneficiaryListBO.getBeneficiaryName()), InsuranceBeneficiaryDO::getBeneficiaryName,beneficiaryListBO.getBeneficiaryName()) 16 .orderByDesc(InsuranceBeneficiaryDO::getCreateTime) 17 .orderByDesc(InsuranceBeneficiaryDO::getId); 18 19 IPage<InsuranceBeneficiaryDO> page = new Page<>(beneficiaryListBO.getCurrentPage(), beneficiaryListBO.getPageSize()); 20 IPage<InsuranceBeneficiaryDO> pageData = this.page(page, beneficiaryQueryWrapper); 21 22 return new PageResult<>(pageData.getRecords(), PageUtil.transformToPaginator(pageData)); 23 }
明明编辑器也没有提示不能使用add,怎么会报出这个异常呢?
通过查阅资料,结合代码进行分析,原来是对不可变集合进行添加操作,导致的异常。下面是分析过程:
Page类(com.baomidou.mybatisplus.extension.plugins.pagination.Page)中:
1 public Page() { 2 this.records = Collections.emptyList(); 3 this.total = 0L; 4 this.size = 10L; 5 this.current = 1L; 6 this.orders = new ArrayList(); 7 this.optimizeCountSql = true; 8 this.isSearchCount = true; 9 this.hitCount = false; 10 }
在Java中,集合框架提供了丰富的工具来处理数据集合。本文将讨论可变集合和不可变集合的使用,特别关注了 Collections.emptyList()
方法。以下是对这些主题的综合整理:
一、Java集合框架简介
Java的集合框架提供了一组接口和类,用于存储和操作对象。主要接口包括 List
、Set
、Map
等,而实现这些接口的类有 ArrayList
、HashSet
、HashMap
等。
二、可变集合 vs 不可变集合
1. 可变集合(Mutable Collections)
可变集合是指可以被修改的集合。例如,使用 ArrayList
或 HashMap
创建的集合就是可变的。可以通过添加、删除、更新元素来改变集合的内容。
2. 不可变集合(Immutable Collections)
不可变集合是指一旦创建后,就不能被修改的集合。Java中没有直接的不可变集合类,但可以通过一些手段创建不可变集合,例如使用 Collections.unmodifiableList()
等方法。
三、Collections.emptyList() 方法
1. emptyList() 概述
-
作用:
Collections.emptyList()
返回一个空的、不可修改的List
实例。 -
好处:
- 减少内存开销。
- 避免空指针异常。
2. 使用及注意事项
-
不可修改性: 返回的空列表是不可修改的,尝试对其进行修改操作会导致
UnsupportedOperationException
异常。 -
返回类型: 实际上是
Collections.EmptyList
,是Collections
类的一个私有静态内部类。 - 不适用于修改操作: 不建议对这个空列表进行添加、删除或其他修改操作。如果需要可修改的空列表,应该选择使用
new ArrayList<>()
。 -
四、综合注意事项
-
适用场景:
- 使用可变集合当需要经常进行增加、删除、更新操作时。
- 使用不可变集合当数据集合不需要被修改时,可以提高安全性和性能。
-
谨慎使用不可变集合: 虽然不可变集合提供了一些好处,但也要谨慎使用,因为每次修改都会返回一个新的集合对象,可能引发性能问题。
五、结论
Java的集合框架为处理不同需求的数据集合提供了灵活性。根据需求,选择可变或不可变集合,并在使用
Collections.emptyList()
等方法时注意不可修改性,将有助于写出更加健壮、高效的代码。 -