0

0

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

P粉602998670

P粉602998670

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

|

267人浏览过

|

来源于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免费学习笔记(深入)”;

恒浪威购商城
恒浪威购商城

基于asp.net2.0框架技术与企业级分布式框架以及与 ms sql server 2000数据库无缝集合而成,并且融合当前流行的ajax技术进行编写的电子商务系统,她整合了多用户商城、单用户商城功能和恒浪网站整合管理系统,吸收绝大部分同类产品的精华和优点,独创网络团购(b2t)电子商务模式,流程化的团购功能和视频导购等功能,是一款极具商业价值的电子商务系统。商城前台功能概述:商城会员可前台自行

下载
  • 替代栈:用 ArrayDeque 而非 Stack(已过时)或 LinkedListpush()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 自定义比较器

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

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

  • 字符串、数字等 JDK 类型自带自然序,可直接用;自定义类必须实现 Comparable 或显式传 Comparator
  • 比较器逻辑必须满足「自反性、对称性、传递性」,否则树结构可能损坏,出现漏查、重复或 NullPointerException
  • 注意 TreeSetcontains()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工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

409

2023.09.04

php中foreach用法
php中foreach用法

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

204

2025.12.04

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

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

718

2023.08.03

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

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

219

2023.09.04

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

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

1561

2023.10.24

字符串介绍
字符串介绍

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

648

2023.11.24

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

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

1148

2024.03.22

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

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

1122

2024.04.29

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

1

2026.03.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.2万人学习

C# 教程
C# 教程

共94课时 | 10.8万人学习

Java 教程
Java 教程

共578课时 | 77.9万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号