讲师中心 微信公众号
AI工具推荐 视频效率加速

Java常用集合类库与使用技巧

酷枫吖_5942

酷枫吖_5942

发布时间:2026-01-13 12:35:02

|

307人浏览过

|

来源于php中文网

原创

ArrayList随机访问O(1)但中间插入O(n),LinkedList头尾增删O(1)但随机访问O(n);ArrayDeque比LinkedList更优;HashMap应预设容量避免扩容;TreeSet/TreeMap需正确实现Comparable或Comparator。

java常用集合类库与使用技巧

ArrayList 和 LinkedList 的性能差异到底在哪

增删改查场景不同,选错集合类会拖慢整个应用。ArrayList 底层是数组,get(int index) 是 O(1),但 add(int index, E element) 在中间插入要移动后续元素,最坏 O(n);LinkedList 是双向链表,addFirst()、addLast() 都是 O(1),但 get(int index) 得从头或尾遍历,O(n/2) → 实际还是 O(n)。

常见错误:用 LinkedList 做大量随机访问(比如循环中反复 get(i)),性能比 ArrayList 差 3–5 倍;或者用 ArrayList 在头部频繁 add(0, x),每次触发数组整体拷贝。

  • 查多改少、需随机索引 → 优先 ArrayList
  • 高频头/尾插入删除、不依赖索引 → LinkedList 可用,但多数情况 ArrayDeque 更优(见下条)
  • Java 8+ 中 LinkedList 的迭代器没有优化,for-each 循环仍会触发 get() 查找,应改用 iterator() 或增强 for 配合 forEach()

ArrayDeque 比 LinkedList 更适合做栈和队列

ArrayDeque 是 Java 推荐的双端队列实现,底层是循环数组,既避免了 LinkedList 的节点对象开销(每个元素多 2 个引用 + 对象头),又比 ArrayList 的头插更高效——它通过调整头尾指针实现 O(1) 的 addFirst() 和 addLast()。

典型误用:用 new LinkedList() 实现栈(push()/pop())或队列(offer()/poll())。虽然语法兼容,但 LinkedList 每次操作都要新建/回收节点,GC 压力大,且缓存局部性差。

立即学习“Java免费学习笔记(深入)”;

jinn-node
jinn-node

在Jinn网络为自主项目工作赚取代币奖励,让闲置的OpenClaw代理开始工作。

下载
  • 替代栈:用 ArrayDeque 而非 Stack(已过时)或 LinkedList;push()、pop()、peek() 全部支持
  • 替代队列:用 ArrayDeque 实现 FIFO,offer() / poll() / peek() 行为一致,且吞吐量高 2–4 倍
  • 注意:它不是线程安全的,多线程需包装为 Collections.synchronizedDeque() 或换用 ConcurrentLinkedDeque

HashMap 初始化容量与负载因子怎么设才不扩容

默认 HashMap 初始容量是 16,负载因子 0.75,意味着放 12 个元素就触发第一次扩容(rehash)。扩容要重建哈希表、重散列所有键,代价很高。如果预估大小明确,应直接指定初始容量。

关键点:传入的初始容量会被自动提升到「大于等于该值的最小 2 的幂」。比如 new HashMap(20) 实际容量是 32,而非 20;而 new HashMap(32) 才真正是 32。

  • 估算元素数 N,按公式算: (int) Math.ceil(N / 0.75),再向上取最近 2 的幂(如 N=100 → 134 → 实际用 128 或 256)
  • 若键是自定义对象,务必重写 equals() 和 hashCode(),否则可能同 key 被当成不同 key 存入多个副本
  • 并发场景别硬套 HashMap,即使加了 synchronized,也建议直接用 ConcurrentHashMap;它分段锁 + CAS,在 JDK 8+ 后用 Node 数组 + 红黑树,读操作完全无锁

TreeSet / TreeMap 的排序陷阱:自然序 vs 自定义比较器

TreeSet 和 TreeMap 底层是红黑树,要求元素可排序。要么实现 Comparable 接口(提供自然序),要么构造时传 Comparator。两者不能混用:如果类实现了 Comparable,但构造 TreeSet 时又传了 Comparator,后者会覆盖前者。

典型报错:ClassCastException: class X cannot be cast to class java.lang.Comparable,说明你往没实现 Comparable 的 TreeSet 里塞了对象,也没传比较器。

  • 字符串、数字等 JDK 类型自带自然序,可直接用;自定义类必须实现 Comparable 或显式传 Comparator
  • 比较器逻辑必须满足「自反性、对称性、传递性」,否则树结构可能损坏,出现漏查、重复或 NullPointerException
  • 注意 TreeSet 的 contains() 和 remove() 依赖比较结果,不是靠 equals();若比较器把两个逻辑相等的对象判为不等,就会查不到
// 错误示例:Comparator 返回 0 仅当字段完全相同,但业务上 "name 忽略大小写 + age 相同" 才算等价
TreeSet<Person> set = new TreeSet<>((a, b) -> {
    int cmp = a.name.compareToIgnoreCase(b.name);
    return cmp != 0 ? cmp : Integer.compare(a.age, b.age);
});
// 正确:确保等价关系与 equals 语义一致,否则 remove("Alice", 30) 可能失败
实际项目里,多数场景用 HashMap + ArrayList 就够了;真需要排序,优先考虑先 sort() 再用 ArrayList,而不是无脑上 TreeMap——红黑树维护成本高,且无法按需切换排序策略。

热门AI工具

更多
LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

1118

2023.09.04

php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

698

2025.12.04

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1558

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2264

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

5784

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

4909

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

6614

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

8934

2024.04.29

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

80

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn