关于ListUtils.partition、Lists.partition方法的实现原理——类似于懒加载思想

背景: 最近在使用这个方法的时候好奇是如何实现的,就点进去查看一下源码,源码如下:

在上面图中可以看到调用了ListUtils.partition方法,在方法中new了一个Partition对象就直接return了并没有对原始的list做分割操作。

于是就比较好奇这个方法是怎么实现list的分割的呢?

分析: 从源码中可以看到Partition这个内部类中有三个方法 get size isEmpty。从代码中不难发现真正处理分割list的方法是get方法中list.subList()这个方法起作用。

于是在idea中debug,查看上图中partition这个对象时发现integers已经按照每个List3个元素分割成了2个List了。但是源码中只是创建了一个Partition类过后啥都没做。那么到什么时候调用到Partition.get()这个方法呢。

在网上查了下资料 IntelliJ IDEA 的调试中,当你查看某个对象的值时,实际上会调用该对象的 toString() 方法来获取其字符串表示形式,以便在调试器中显示。

Partition继承了AbstractList,AbstractList抽象类继承了AbstractCollection抽象类,而AbstractCollection重写了toString方法,AbstractList和Partition均未重写该方法,说明调用就是AbstractCollection类的toString方法。下图是AbstractCollection类的toString方法

而toString里面使用了迭代器,而真正调用到Partition.get()是在迭代器的next方法中。在AbstractList中如下图:

所以ListUtils.partition这个方法并没有直接做分割操作,而是在我查看partition对象时,触发了partition.toString()方法才真正的对原始List做了分割。这是一种懒加载的思想。

同样的对partition对象做遍历操作,由于for循环底层上还是通过迭代器来实现的,那么这也是在使用的时候才分割的List。

另外Google Guava库中的Lists.partition方法也是类似的实现

总结:使用了懒加载的思想的优点

  1. 节省内存资源:使用懒加载的方式,不需要一次性将所有的子列表都生成出来,而是按需生成。这意味着在处理大型列表时,只有当前需要的子列表会被生成,而不会同时占用大量内存资源。这对于内存受限的环境下特别有用。
  2. 提高性能:由于不需要一次性生成所有的子列表,懒加载能够减少不必要的计算和内存分配,从而提高了程序的性能。特别是当处理的数据量很大时,避免了一次性加载整个数据集合所带来的性能问题。
  3. 灵活性:懒加载使得数据在需要时才被加载,这意味着可以根据实际需求动态地生成数据,而不需要预先分配所有可能的情况。这种灵活性使得程序更容易适应不同的需求和场景。
  4. 简化代码逻辑 :懒加载的方式使得代码逻辑更加简洁明了。不需要手动管理生成子列表的过程,而是由ListUtils.partition方法自动按需生成,减少了代码的复杂性和错误的可能性。

总的来说,懒加载思想在ListUtils.partition方法中的应用使得对大型数据集合的处理更加高效、灵活,并且能够节省内存资源,提高程序性能。

相关推荐
骑着蜗牛撵大象3273 小时前
豆包 Seed 驱动的记账智能体:从拍票抽取到月报生成的全链路落地记录
java·前端·javascript·结构化输出·豆包seed·多模态识别·记账系统
憧憬成为java架构高手的小白3 小时前
langchain4j手敲理解
java·langchain
10mAh3 小时前
【Java】ArrayList 遍历删除为什么报错?三种写法与漏删复现
java·开发语言·windows
thefool1122664 小时前
多线程 4
java
Rain的Java大神之路4 小时前
[特殊字符]8年Java老兵转型AI Agent:90%的人挂在同一个坑,根本不用学Python!(万字实战复盘,建议收藏)
java·数据库·人工智能·后端·python·spring·ai编程
高级程序源4 小时前
springboot大学生体测系统72170-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·django·课程设计
IT研究室4 小时前
最新计算机毕业设计选题推荐-基于spring boot的文学名著分享系统-网站-文档指导-Java-springboot
java·spring boot·课程设计
denlaku4 小时前
JDK 13 新特性详解
java·开发语言
秋饼4 小时前
Java 后端企业级 LLM 网关实战:Spring Cloud Gateway 构建统一大模型接入层
java·ai·技术分享·后端开发
今年下半年5 小时前
【防重放】Spring Boot 通过自定义注解实现接口防重放
java·spring boot·自定义注解·防重放