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

Java集合初始化:Lists.newArrayList vs new ArrayList()

文章目录

  • 前言
    • 一、核心区别全景图
    • 二、代码实现深度对比
      • 1. 初始化方式对比
      • 2. 容量预分配机制
    • 三、性能与底层原理
      • 1. 内存分配策略
      • 2. 基准测试数据(JMH)
    • 四、Guava的进阶功能生态
      • 1. 集合转换
      • 2. 集合分片
      • 3. 不可变集合创建
    • 五、最佳实践指南
    • 六、源码级实现解析
      • 1. Guava `newArrayList`源码
      • 2. JDK `ArrayList`构造函数
    • 七、结语

前言

作为一名资深Java开发工程师,我们在日常开发中常常面临集合初始化的抉择:是使用Guava库的Lists.newArrayList,还是直接使用Java原生的new ArrayList<>()?看似简单的选择背后,蕴含着对代码质量、性能优化和架构设计的深刻考量。

一、核心区别全景图

维度Lists.newArrayListnew ArrayList<>()
依赖要求依赖Guava库(需引入Maven/Gradle依赖)Java原生API,无需额外依赖
代码简洁性支持可变参数、自动泛型推导、容量预分配需结合Arrays.asList或显式设置容量
功能扩展性提供Guava生态的高级集合操作(如partition、transform)仅支持标准库基础功能
性能表现底层调用与原生一致,Guava的容量优化方法更高效原生实现,无额外性能损耗
适用场景Guava用户、复杂集合操作需求通用场景、轻量级项目

二、代码实现深度对比

1. 初始化方式对比

// Guava方式:可变参数+自动泛型推导
List<String> guavaList = Lists.newArrayList("Java", "Python", "Go");// 原生方式:需手动转换
List<String> nativeList = new ArrayList<>(Arrays.asList("Java", "Python", "Go"));

亮点分析:Guava通过静态工厂方法自动推导泛型类型,避免了Arrays.asList()的冗余调用,代码更符合函数式编程风格。

2. 容量预分配机制

// Guava智能容量分配
List<String> optimizedList = Lists.newArrayListWithExpectedSize(100); // 避免扩容开销// 原生方式需显式指定
List<String> naiveList = new ArrayList<>(100);

源码透视Lists.newArrayListWithExpectedSize(int size)内部调用new ArrayList<>(size + 1),预留1个空位减少扩容次数,这是Guava对JDK实现的优化。


三、性能与底层原理

1. 内存分配策略

  • Guava优化:通过newArrayListWithCapacity(int size)方法,开发者可精确控制初始容量,避免动态扩容的系统开销。
  • JDK默认行为ArrayList默认初始容量为10,扩容时新容量为旧容量的1.5倍。

2. 基准测试数据(JMH)

Benchmark                             Mode  Cnt   Score   Error  Units
AddElementsTest.guavaArrayList      thrpt   20  32.123 ± 1.023  ops/ms
AddElementsTest.nativeArrayList     thrpt   20  31.987 ± 0.981  ops/ms

结论:两者性能几乎一致,Guava的优化主要体现在初始化阶段的容量预分配策略上,对大规模数据处理场景更有价值。


四、Guava的进阶功能生态

除了基础的集合初始化,Guava还提供了强大的集合操作工具链:

1. 集合转换

List<String> upperList = Lists.transform(Lists.newArrayList("java", "python"), String::toUpperCase
);

2. 集合分片

List<List<String>> partitioned = Lists.partition(Lists.newArrayList("a", "b", "c", "d"), 2
); // [[a,b], [c,d]]

3. 不可变集合创建

ImmutableList<String> immutableList = ImmutableList.of("Java", "Kotlin");

设计哲学:Guava通过函数式编程范式和不可变集合设计,显著提升了集合操作的安全性和可维护性。


五、最佳实践指南

场景分类推荐方案技术选型依据
项目已集成GuavaLists.newArrayList(...)复用现有依赖,提升代码一致性
需要复杂集合操作Guava集合工具链利用Guava的transformpartition等高级API
高频扩容场景newArrayListWithCapacity(...)精准控制容量,避免内存抖动
轻量级微服务new ArrayList<>()减少依赖体积,提升部署效率
需要不可变集合ImmutableList.of(...)保证集合不可变性,防止并发修改

六、源码级实现解析

1. Guava newArrayList源码

public static <E> ArrayList<E> newArrayList() {return new ArrayList<E>();
}public static <E> ArrayList<E> newArrayList(Iterable<? extends E> elements) {return (elements instanceof Collection)? new ArrayList<E>((Collection<E>) elements): newArrayList(elements.iterator());
}

2. JDK ArrayList构造函数

public ArrayList(int initialCapacity) {this.elementData = new Object[initialCapacity];
}public ArrayList(Collection<? extends E> c) {elementData = c.toArray();size = elementData.length;
}

核心洞察:Guava通过封装不同构造场景,提供了更友好的API设计,而JDK保持了最小化实现原则。


七、结语

在Java生态中,Lists.newArrayListnew ArrayList<>()并非对立关系,而是不同设计哲学的产物。Guava通过工具链扩展丰富了集合操作的可能性,而JDK则保持了原生API的简洁性。

相关文章:

Java集合初始化:Lists.newArrayList vs new ArrayList()

文章目录 前言一、核心区别全景图二、代码实现深度对比1. 初始化方式对比2. 容量预分配机制 三、性能与底层原理1. 内存分配策略2. 基准测试数据&#xff08;JMH&#xff09; 四、Guava的进阶功能生态1. 集合转换2. 集合分片3. 不可变集合创建 五、最佳实践指南六、源码级实现解…...

VBA清空数据

列数转字母 Function CNtoW(ByVal num As Long) As String CNtoW Replace(Cells(1, num).Address(False, False), "1", "") End Function 字母转列数 Function CWtoN(ByVal AB As String) As Long CWtoN Range("a1:" & AB & &…...

【信息系统项目管理师-选择真题】2025上半年(第二批)综合知识答案和详解(回忆版)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20题】【第…...

Java Lambda 表达式的缺点和替代方案

Java 8 引入的 Lambda 表达式曾被誉为编写简洁、函数式代码的革命性工具。但说实话,它们并不是万能钥匙。它有不少问题,比如它没有宣传的那么易读,在某些场景下还带来性能开销。 作为一名多年与 Java 冗长语法搏斗的开发者,我找到了更注重清晰、可维护性和性能的替代方案。…...

TDengine 开发指南—— UDF函数

UDF 简介 在某些应用场景中&#xff0c;应用逻辑需要的查询功能无法直接使用内置函数来实现&#xff0c;TDengine 允许编写用户自定义函数&#xff08;UDF&#xff09;&#xff0c;以便解决特殊应用场景中的使用需求。UDF 在集群中注册成功后&#xff0c;可以像系统内置函数一…...

使用vsftpd搭建FTP服务器(TLS/SSL显式加密)

安装vsftpd服务 使用vsftpd RPM安装包安装即可&#xff0c;如果可以访问YUM镜像源&#xff0c;通过dnf或者yum工具更加方便。 yum -y install vsftpd 启动vsftpd、查看服务状态 systemctl enable vsftpd systemctl start vsftpd systemctl status vsftpd 备份配置文件并进…...

1.1Nodejs和浏览器中的二进制处理

Buffer 在 Node.js 中&#xff0c;Buffer 类用于处理二进制数据。由于 JavaScript 在浏览器环境中主要用于处理字符串和数字等类型的数据&#xff0c;对二进制数据的处理能力较弱&#xff0c;因此 Node.js 引入了 Buffer 类来弥补这一不足&#xff0c;特别是在处理文件系统操作…...

入门AJAX——XMLHttpRequest(Post)

一、前言 在上篇文章中&#xff0c;我们已经介绍了 HMLHttpRequest 的GET 请求的基本用法&#xff0c;并基于我提供的接口练习了两个简单的例子。如果你还没有看过第一篇文章&#xff0c;强烈建议你在学习完上篇文章后再学习本篇文章&#xff1a; &#x1f517;入门AJAX——XM…...

Qt(part1)Qpushbutton,信号与槽,对象树,自定义信号与槽,lamda表达式。

1、创建Qt程序 2、命名规范及快捷键 3、Qpushbutton按钮创建 4、对象树概念 5、信号与槽 6、自定义信号与槽 7、当自定义信号和槽发生重载时 8、信号可以连接信号&#xff0c;信号也可以断开。 9、lamda表达式...

西北某省级联通公司:3D动环模块如何实现机房“一屏统管”?

一、运营商机房监控痛点凸显 在通信行业快速发展的当下&#xff0c;西北某省级联通公司肩负着保障区域通信畅通的重任。然而&#xff0c;公司分布广泛的机房面临着诸多监控难题&#xff0c;尤其是偏远机房环境风险无法实时感知这一痛点&#xff0c;严重影响了机房的稳定运行和通…...

【WPF】从普通 ItemsControl 到支持筛选的 ItemsControl:深入掌握 CollectionViewSource 用法

✨ 从普通 ItemsControl 到支持筛选的 ItemsControl&#xff1a;深入掌握 CollectionViewSource 用法 在日常 WPF 开发中&#xff0c;我们经常需要对数据进行筛选、排序、分组等操作&#xff0c;而原生的 ItemsControl 并不直接支持这些功能。本文将介绍如何通过 CollectionVi…...

Zookeeper 和 Kafka 版本与 JDK 要求

Apache Zookeeper 和 Apache Kafka 在不同版本中对 JDK 的要求如下表所示(基于官方文档和历史版本记录整理): 1. Zookeeper 版本与 JDK 要求 Zookeeper 版本要求的最低 JDK 版本说明3.4.x 系列JDK 6生产环境建议用 JDK 8(旧版兼容性强)。3.5.x 系列(3.5.5+)JDK 83.5.0 …...

3步布局关键词让流量更精准

其实流量不精准&#xff0c;90% 是关键词没布局好&#xff01; 掌握这 3 个超实用技巧&#xff0c;让你的内容精准推给目标人群&#xff01; 第一步&#xff1a;深挖高潜力关键词 别再一股脑用 “好看”“好用” 这些泛词啦&#xff01;打开平台搜索框&#xff0c;输入核心词…...

视觉分析在人员行为属性检测中的应用

基于视觉分析的人员行为属性检测方案 一、背景与需求分析 在工业生产、建筑施工、公共安全等领域&#xff0c;人员行为属性的合规性检测是保障安全生产的关键环节。例如&#xff0c;工地工人未佩戴安全帽、厨房人员未佩戴手套、作业现场人员使用手机等行为&#xff0c;均可能…...

学习 React【Plan - June - Week 1】

一、使用 JSX 书写标签语言 JSX 是一种 JavaScript 的语法扩展&#xff0c;React 使用它来描述用户界面。 什么是 JSX&#xff1f; JSX 是 JavaScript 的一种语法扩展。看起来像 HTML&#xff0c;但它实际上是在 JavaScript 代码中写 XML/HTML。浏览器并不能直接运行 JSX&…...

电子行业AI赋能软件开发经典案例——某金融软件公司

01.案例标题 金融行业某金融软件公司通过StarShip CodeSouler达成效率突破性增长&#xff0c;零流程侵入验证AI代码高度可行性 02.执行摘要 某金融软件公司在核心产品研发中引入开放传神&#xff08;OpenCSG&#xff09;的StarShip CodeSouler AI代码生成平台&#xff0c;在无…...

【前端】js如何处理计算精度问题

JavaScript 的精度问题源于其遵循 IEEE 754 标准的 64 位双精度浮点数表示法&#xff0c;导致 0.1 0.2 ! 0.3 等经典问题。以下是系统化的解决方案及适用场景&#xff1a; ⚙️ 一、整数转换法&#xff08;适合简单运算&#xff09; 将小数转换为整数运算后再还原&#xff0…...

使用 Python 自动化 Word 文档样式复制与内容生成

在办公自动化领域&#xff0c;如何高效地处理 Word 文档的样式和内容复制是一个常见需求。本文将通过一个完整的代码示例&#xff0c;展示如何利用 Python 的 python-docx 库实现 Word 文档样式的深度复制 和 动态内容生成&#xff0c;并结合知识库中的最佳实践优化文档处理流程…...

Kafka 核心架构与消息模型深度解析(二)

案例实战&#xff1a;Kafka 在实际场景中的应用 &#xff08;一&#xff09;案例背景与需求介绍 假设我们正在为一个大型电商平台构建数据处理系统。该电商平台拥有庞大的用户群体&#xff0c;每天会产生海量的订单数据、用户行为数据&#xff08;如浏览、点击、收藏等&#…...

4G网络中频段的分配

国内三大运营商使用的4G网络频段及对应关系如下&#xff1a; &#x1f4f6; 一、中国移动&#xff08;以TD-LTE为主&#xff09; 主力频段 Band 38&#xff08;2570-2620MHz&#xff09;&#xff1a;室内覆盖Band 39&#xff08;1880-1920MHz&#xff09;&#xff1a;广覆盖&am…...

SQL进阶之旅 Day 19:统计信息与优化器提示

【SQL进阶之旅 Day 19】统计信息与优化器提示 文章简述 在数据库性能调优中&#xff0c;统计信息和优化器提示是两个至关重要的工具。统计信息帮助数据库优化器评估查询成本并选择最佳执行计划&#xff0c;而优化器提示则允许开发人员对优化器的行为进行微调。本文深入探讨了…...

数据结构之LinkedList

系列文章目录 数据结构之ArrayList-CSDN博客 目录 系列文章目录 前言 一、模拟实现链表 1. 遍历链表 2. 插入节点 3. 删除节点 4. 清空链表 二、链表的常见操作 1. 反转链表 2. 返回链表的中间节点 3. 链表倒数第 k 个节点 4. 合并两个有序链表 5. 分割链表 6. 判…...

摆脱硬件依赖:SkyEye在轨道交通中的仿真应用

在城市轨道交通系统中&#xff0c;信号系统承担着确保列车安全、高效运行的关键任务。从排列进路、信号开放&#xff0c;到终点折返与接发车&#xff0c;几乎每一个调度动作背后都依赖于信号系统的精密控制与实时响应。作为信号系统的重要组成部分&#xff0c;目标控制器&#…...

使用变异系数增强 CFD 收敛标准

将描述性统计整合到 CFD 中&#xff0c;以评估可变性和收敛性。 挑战 在工程设计中&#xff0c;尤其是在进行仿真时&#xff0c;我们经常处理描述流体、温度、应力或浓度行为的大型数据集。以有意义的方式解释这些值需要的不仅仅是原始数字;它需要对统计的理解。 统计学在工程…...

解决获取视频第一帧黑屏问题

文章目录 解决获取视频第一帧黑屏问题核心代码 解决获取视频第一帧黑屏问题 废话不多说&#xff0c;直接上代码&#xff1a; <script setup> const status ref(请点击“添加视频”按钮添加视频) const videoElement ref(document.createElement(video)) const curren…...

物联网通信技术全景指南(2025)之如何挑选合适的物联网模块

物联网通信技术全景指南&#xff08;2025&#xff09;之 如何挑选合适的物联网模块 物联网通信技术全景指南&#xff08;2025&#xff09;一、技术代际演进与退网背景二、5G 物联网技术体系&#xff08;Sub-6 GHz 核心&#xff09;1. 技术分层架构2. 蜂窝技术性能矩阵3. Sub-6 …...

影楼精修-AI衣服祛褶皱算法解析

注&#xff1a;为避免侵权&#xff0c;本文所用图像均为AIGC生成或无版权网站提供&#xff1b; 衣服祛褶皱功能&#xff0c;目前在像素蛋糕、美图云修、百度网盘AI修图、阿里云都有相关的功能支持&#xff0c;它的价值就是将不平整的衣服图像&#xff0c;变得整齐平整&#xf…...

Day46 Python打卡训练营

知识点回顾&#xff1a; 1. 不同CNN层的特征图&#xff1a;不同通道的特征图 2. 什么是注意力&#xff1a;注意力家族&#xff0c;类似于动物园&#xff0c;都是不同的模块&#xff0c;好不好试了才知道。 3. 通道注意力&#xff1a;模型的定义和插入的位置 4. 通道注意力后…...

信号电压高,传输稳定性变强,但是传输速率下降?

信号电压高&#xff0c;传输稳定性变强&#xff0c;但是传输速率下降&#xff1f; 一、信号电压升高&#xff0c;传输稳定性变强 1.信号幅度更大&#xff0c;抗噪声能力增强 2.噪声&#xff0c;比如干扰电磁波&#xff0c;串扰等相对于信号幅度比例变小&#xff0c;误码率降低 …...

linux安全加固(非常详细)

安全加固方案原则 1.版本升级 对于系统和应用在使用过程中暴露的安全缺陷&#xff0c;系统或应用厂商会及时发布解决问题的升级补丁包。升级系统或应用版本&#xff0c;可有效解决旧版本存在的安全风险。2.关闭端口服务 在不影响业务系统正常运行情况下&#xff0c;停止或禁用承…...