首页 > 编程语言 >Java集合操作:UnsupportedOpertionExcepion产生的原因以及解决办法

Java集合操作:UnsupportedOpertionExcepion产生的原因以及解决办法

时间:2023-12-09 18:23:50浏览次数:33  
标签:解决办法 Java emptyList UnsupportedOpertionExcepion beneficiaryListBO Collections 集合

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的集合框架提供了一组接口和类,用于存储和操作对象。主要接口包括 ListSetMap 等,而实现这些接口的类有 ArrayListHashSetHashMap 等。

二、可变集合 vs 不可变集合

1. 可变集合(Mutable Collections)

可变集合是指可以被修改的集合。例如,使用 ArrayListHashMap 创建的集合就是可变的。可以通过添加、删除、更新元素来改变集合的内容。

2. 不可变集合(Immutable Collections)

不可变集合是指一旦创建后,就不能被修改的集合。Java中没有直接的不可变集合类,但可以通过一些手段创建不可变集合,例如使用 Collections.unmodifiableList() 等方法。

三、Collections.emptyList() 方法

1. emptyList() 概述

  • 作用: Collections.emptyList() 返回一个空的、不可修改的 List 实例。

  • 好处:

    1. 减少内存开销。
    2. 避免空指针异常。

2. 使用及注意事项

  • 不可修改性: 返回的空列表是不可修改的,尝试对其进行修改操作会导致 UnsupportedOperationException 异常。

  • 返回类型: 实际上是 Collections.EmptyList,是 Collections 类的一个私有静态内部类。

  • 不适用于修改操作: 不建议对这个空列表进行添加、删除或其他修改操作。如果需要可修改的空列表,应该选择使用 new ArrayList<>()
  • 四、综合注意事项

    • 适用场景:

      • 使用可变集合当需要经常进行增加、删除、更新操作时。
      • 使用不可变集合当数据集合不需要被修改时,可以提高安全性和性能。
    • 谨慎使用不可变集合: 虽然不可变集合提供了一些好处,但也要谨慎使用,因为每次修改都会返回一个新的集合对象,可能引发性能问题。

    五、结论

    Java的集合框架为处理不同需求的数据集合提供了灵活性。根据需求,选择可变或不可变集合,并在使用 Collections.emptyList() 等方法时注意不可修改性,将有助于写出更加健壮、高效的代码。

标签:解决办法,Java,emptyList,UnsupportedOpertionExcepion,beneficiaryListBO,Collections,集合
From: https://www.cnblogs.com/hld123/p/17891283.html

相关文章

  • Java 方法体
    1抽象方法{2345}1构造方法{2例{3classAAAA{4privateintp=10;//new的时候赋值一次56publicAAAA(){7System.out.println(p);//先执行privateintp=10在执行System.o......
  • 【JavaSE】集合Collection{List(ArrayList, LinkedList), Set(TreeSet, HashSet, Link
    集合单列集合:Collection接口单列集合:一次添加一个元素;如果集合中添加的是类,要重写equals方法,否则比较的是地址,无法正常删除内容相同的元素。单列集合通用遍历方式1.迭代器遍历2.增强for循环遍历增强for循环底层逻辑还是迭代器,字节码文件反编译为java会发现还是迭代......
  • 【JavaSE】数据结构(栈、队列、数组、链表)
    什么是数据结构?数据结构是计算机底层存储、组织数据的方式,是指数据相互之间是什么方式排列在一起的常见的数据结构栈、队列、数组、链表二叉树、二叉查找树、平衡二叉树、红黑树哈希表栈特点:先进后出队列特点:先进先出数组特点:有索引,内存连续优点:查询速度快O(1)缺点:增......
  • 【JavaSE】数据结构(树:二叉查找树、平衡二叉树、AVL树、红黑树)
    树度:每个节点的子节点数量树高:树的总层数根节点:入度为0的节点二叉树每个节点最多有两个子节点二叉查找树任意节点左子树上的节点都小于当前节点,右子树上的节点都大于当前节点平衡二叉树任意节点的左右子树的高度差不超过1AVL树AVL树是一种平衡二叉树,得名于其发明者的......
  • 【JavaSE】数据结构-哈希表(HashSet/HashMap底层哈希表详解,源码分析)
    哈希表结构JDK8版本之前:数组+链表JDK8版本及之后:数组+链表+红黑树哈希表HashMapput()方法的添加流程创建HashSet集合时,构造方法中自动创建HashMap集合;HashMap空参构造方法会创建一个默认长度为16,默认加载因子为0.75的数组,数组名为table(tips:实际上,HashSet对象创建后,第......
  • 简单了解java中的io流中的字节流
    了解一下前置知识字符集,我们常见的字符集有ASCII,GBK,UTF-8GBK中一个字需要两个字节存储UTF-8中一个字母需要一个字节,并以0开头,一个汉字需要三个字节,与GBK不同的是,他支持的是世界文字,是一种相当通用的字符集IDEA中的字符集在右下角可以看到,默认是utf-8,在java中进行编码和解码......
  • Java对象的空值判断
    以前一直被java的NPE(NullPointerException)所谓的空指针异常搞的头昏脑涨,有大佬说过“防止NPE,是程序员的基本修养。”但是修养归修养,也是我们程序员最头疼的问题之一,那么我们今天就要尽可能的利用Java8的新特性Optional来尽量简化代码同时高效处理NPE(NullPointer......
  • Java开发者的Python快速进修指南:实战之跳表pro版本
    之前我们讲解了简易版的跳表,我希望你能亲自动手实现一个更完善的跳表,同时也可以尝试实现其他数据结构,例如动态数组或哈希表等。通过实践,我们能够发现自己在哪些方面还有所欠缺。这些方法只有在熟练掌握之后才会真正理解,就像我在编写代码的过程中,难免会忘记一些方法或如何声明属性等......
  • Java执行cmd命令.并打印输出. 解决中文乱码 .
    packageorg.example;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.nio.charset.Charset;publicclassMain{publicstaticvoidmain(String[]args){try{ProcessBuilder......
  • 【JavaSE】可变参数
    可变参数可变参数用在形参中可以接收多个数据可变参数的格式:数据类型...参数名称可变参数的特点:方便,可以不传输参数,可以传输一个或者多个,也可以传输一个数组可变参数在方法内部本质上就是一个数组注意事项:一个形参列表中可变参数只能有一个可变参数必须放在形参列表的......