当前位置: 首页 > news >正文

网站定制哪家快高档网站设计公司

网站定制哪家快,高档网站设计公司,购物网商城,手机可以建网站吗处理几万条数据的 List 分页,关键在于平衡​​性能​​、​​内存占用​​和​​开发效率​​。下面我用一个表格为你总结几种主流方法的优缺点,帮你快速决策:方法优点缺点适用场景​​subList()​​​​性能极佳​​ (返回原列表视图&#x…

处理几万条数据的 List 分页,关键在于平衡​​性能​​、​​内存占用​​和​​开发效率​​。下面我用一个表格为你总结几种主流方法的优缺点,帮你快速决策:

方法

优点

缺点

适用场景

subList()

​性能极佳​​ (返回原列表视图,不创建新集合)

分页结果与原列表​​绑定​​,原列表修改会影响分页结果

需要​​最高性能​​、且能接受分页结果与源数据联动的大数据量分页

​Stream API​

​函数式风格​​,代码简洁,可与流操作链式组合

会​​创建新列表​​,有一定内存开销

适合在分页​​前后需要进行复杂数据操作​​(如过滤、映射)的场景

​Apache Commons​

代码简洁,一次分块可多次取页,​​生成真实副本​​,数据隔离性好

需引入 commons-collections4依赖

需要​​数据隔离​​或已使用该库的其他功能时

​Google Guava​

与 Apache Commons 类似,提供​​更丰富的集合操作​​功能

需引入 guava依赖

项目已使用 Guava 或需要其更多集合工具时


🛠️ 代码示例与说明

1. 使用 subList()(性能最佳)
public static <T> List<T> paginateBySubList(List<T> sourceList, int pageNum, int pageSize) {if (sourceList == null || sourceList.isEmpty()) {return Collections.emptyList();}int totalItems = sourceList.size();int fromIndex = (pageNum - 1) * pageSize;if (fromIndex >= totalItems) {return Collections.emptyList(); // 请求页码超出范围,返回空列表}int toIndex = Math.min(fromIndex + pageSize, totalItems);return sourceList.subList(fromIndex, toIndex);
}

​关键说明​​:subList()返回的是原列表的一个​​视图​​。这意味着:

  • ​优点​​:性能极高,因为不会复制数据,只是包装了一个偏移量。

  • ​注意​​:如果你不希望分页的结果随着原列表的修改而改变,或者原列表可能被修改导致分页结果失效,你需要创建它的副本:return new ArrayList<>(sourceList.subList(fromIndex, toIndex));

2. 使用 Stream API(函数式风格)
public static <T> List<T> paginateByStream(List<T> sourceList, int pageNum, int pageSize) {if (sourceList == null || sourceList.isEmpty()) {return Collections.emptyList();}return sourceList.stream().skip((pageNum - 1) * pageSize).limit(pageSize).collect(Collectors.toList());
}

​关键说明​​:这种方式会​​创建新的列表对象​​,因此内存开销比 subList()大,但代码非常清晰,尤其适合在分页前后进行过滤、映射等流操作。

3. 使用 Apache Commons Collections
// 首先需要引入依赖:org.apache.commons:commons-collections4
import org.apache.commons.collections4.ListUtils;public static <T> List<T> paginateByApacheCommons(List<T> sourceList, int pageNum, int pageSize) {if (sourceList == null || sourceList.isEmpty()) {return Collections.emptyList();}List<List<T>> partitions = ListUtils.partition(sourceList, pageSize); // 先按页大小分割if (pageNum < 1 || pageNum > partitions.size()) {return Collections.emptyList();}return partitions.get(pageNum - 1);
}

​关键说明​​: ListUtils.partition会先将列表按指定大小分块,返回一个包含各分块视图的列表。获取某一页时,get方法会​​创建该分块的新列表副本​​,因此返回的数据与原列表隔离,不受修改影响。

4. 使用 Google Guava
// 首先需要引入依赖:com.google.guava:guava
import com.google.common.collect.Lists;public static <T> List<T> paginateByGuava(List<T> sourceList, int pageNum, int pageSize) {if (sourceList == null || sourceList.isEmpty()) {return Collections.emptyList();}List<List<T>> partitions = Lists.partition(sourceList, pageSize);if (pageNum < 1 || pageNum > partitions.size()) {return Collections.emptyList();}return partitions.get(pageNum - 1);
}

​关键说明​​: 其原理和用法与 Apache Commons 非常相似,同样会生成数据隔离的分页结果。如果你的项目已经大量使用 Guava,这是不错的选择。


⚠️ 重要提醒与优化建议

处理几万条数据时,以下几点至关重要:

  1. ​数据来源是根本​​:如果这些数据来自​​数据库​​,​​强烈建议直接在数据库查询时进行分页​​(如 SQL 的 LIMIT ... OFFSETROW_NUMBER()或 MyBatis PageHelper 等),而不是将所有数据读到内存中再分页。这是处理大数据集最有效的方法。

  2. ​内存警告​​:将几万条数据全部加载到内存中本身就有​​内存溢出(OOM)的风险​​。请务必评估你的列表大小和JVM内存设置。

  3. ​边界处理​​:所有示例中都包含了对空列表、页码越界的检查,这是生产代码中必不可少的。

  4. ​页码惯例​​:通常​​页码 (pageNum) 从 1 开始​​计算。

  5. ​考虑更优分页策略​​:对于超大数据集,传统的 LIMIT ... OFFSET在深度分页时性能会下降。可以考虑基于​​游标(Cursor)​​ 或​​上次检索到的最大ID​​的分页方式(例如 WHERE id > ? ORDER BY id LIMIT ?),性能更稳定。


💡 如何选择?

  • ​追求极致性能​​,且能接受分页视图与原列表的关联:选 ​subList()​。

  • 需要在分页流程中集成​​复杂的流式操作​​:选 ​​Stream API​​。

  • ​希望代码简洁​​,且需要​​分页结果与原列表数据隔离​​:选择 ​​Apache Commons​​ 或 ​​Google Guava​​。两者类似,取决于你的项目依赖偏好。

  • ​最重要的一点​​:如果数据源自数据库,​​务必在SQL查询层面进行分页​​,这是最根本的优化。

希望这些信息能帮助你为几万条数据选择合适的分页方法!

http://www.dtcms.com/a/618120.html

相关文章:

  • 信创产品认证机构有哪些?信创检测报告和信创产品评估证书如何办理?
  • 官方网站建设计划书文山做网站yunling88
  • 数据分析笔记12:函数
  • 如何驯服AI编程
  • 电动自行车起火酿事故,智慧社区如何分阶段阻绝灾害发生?
  • 淄博做网站的公司排名优化系统
  • 基于Rust构建一个实用的图片转Base64工具
  • asp.net mvc做网站难吗胶州网站优化
  • [C#] NO.4 我的第一个项目
  • 运放之电压跟随器
  • CSS3 框大小
  • 商城网站系统资源
  • 网站源码怎么有苏州首页关键词优化
  • 深度学习实战(基于pytroch)系列(二十二)多通道输入输出
  • 本周热搜(11月9日~11月16日)
  • React useMemo(当依赖项未变化,重复渲染时直接返回上一次缓存计算结果,而非重新执行计算)
  • 【IOS开发】Objective-C 与 Swift 的对比
  • 在STM32 HAL库中使用 WFI 实现低功耗准确延时
  • 编程语言落地手册:erlang实现与汇编剖析
  • 搜索下单(es、mysql、MQ同步;关于事务失效)
  • aleph-node Node upgrade instructions 节点升级说明
  • 找谁做网站网站建设与运营培训班
  • 智能制造与工业4.0:5G与物联网的深度融合
  • GSV1201S(2201S)#ACP@支持 DisplayPort 1.2 到 HDMI 1.4 转换且集成嵌入式 MCU
  • Linux SPI 驱动实验
  • 【开题答辩全过程】以 基于Java的水族馆销售与经营管理系统的设计与实现为例,包含答辩的问题和答案
  • 网站响应是什么问题吗最近国际时事
  • 从拟南芥到线虫:我的生物信息学多组学实操笔记
  • 指尖革命!2025输入法生态位深度测评:智能,远不止于输入!
  • 如何在Windows系统上安装和配置Node.js及Node版本管理器(nvm)