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

Java集合框架的核心概念与使用技巧

雨伟小哥_5965

雨伟小哥_5965

发布时间:2026-01-12 16:32:49

|

500人浏览过

|

来源于php中文网

原创

ArrayList尾部add均摊O(1),中间插入需移动元素;LinkedList任意位置add本为O(1),但add(int,E)先遍历查节点致O(n);高频尾加选ArrayList,已知位置插删可用LinkedList配合listIterator()。

java集合框架的核心概念与使用技巧

为什么 ArrayList 和 LinkedList 的 add() 行为看似一样,性能却差十倍?

因为 ArrayList 底层是数组,add() 默认追加时均摊 O(1),但中间插入(如 add(index, e))需移动后续元素;LinkedList 是双向链表,任意位置 add() 都是 O(1),但前提是已持有目标节点引用——而 add(int, E) 会先调用 node(int) 遍历查找,实际变成 O(n)。

  • 高频尾部追加 → 选 ArrayList(注意预设 initialCapacity 避免多次扩容)
  • 频繁在头部或已知位置插入/删除 → 用 LinkedList,但必须配合 listIterator() 或直接操作 Node(不推荐手动)
  • 别用 LinkedList 当“更灵活的 List”——它在随机访问、内存占用、缓存局部性上全面劣于 ArrayList

HashMap 的 key 为什么必须重写 equals() 和 hashCode()?

因为 HashMap 查找流程是:先算 hashCode() 定位桶(bucket),再用 equals() 在该桶内比对键。若只重写 equals() 不重写 hashCode(),两个逻辑相等的对象可能被散列到不同桶,导致 get() 返回 null;若只重写 hashCode(),所有对象哈希值相同,退化为链表遍历,性能暴跌。

  • IDE 自动生成的 hashCode()/equals() 覆盖全部参与比较的字段
  • 不可变类(如 String、自定义 final 类)作 key 最安全;若用可变对象,确保修改后 hashCode() 不变
  • Objects.hash(a, b, c) 比手写 31 * a.hashCode() + b.hashCode() 更简洁且防空指针

ConcurrentHashMap 在 JDK 8 后为什么不再用分段锁?

JDK 7 的 ConcurrentHashMap 用 Segment 数组分段加锁,粒度粗、内存开销大;JDK 8 改为 synchronized 锁单个 Node(即哈希桶头结点),配合 CAS + 红黑树优化长链表场景,锁粒度更细、扩容支持并发、代码更简洁。

Zenlink - Node SDK for ZenHeart
Zenlink - Node SDK for ZenHeart

ZenHeart zenlink 与 zenlink-mcp 为 OpenClaw,涵盖安装、MCP 注册、钩子接线、入站轮询及升级维护。

下载
  • 高并发读多写少场景下,ConcurrentHashMap 远优于 Collections.synchronizedMap()
  • computeIfAbsent() 是线程安全的“查无则建”,避免先 get() 再 put() 的竞态条件
  • 不要假设 size() 实时准确——它返回估算值;需精确计数建议用 mappingCount()

Stream.collect() 用 Collectors.toList() 为什么有时返回不可变集合?

从 JDK 16 开始,Collectors.toList() 默认返回的是不可修改的 List(内部是 ImmutableCollections.ListN),调用 add() 或 clear() 会抛 UnsupportedOperationException。这不是 bug,而是为了防止意外修改流式处理结果。

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

  • 需要可变列表 → 显式构造:new ArrayList(stream.collect(Collectors.toList()))
  • 或改用 Collectors.toCollection(ArrayList::new)
  • 同理,toSet()、toMap() 在新版本中也倾向返回不可变实现,留意运行时异常
List<String> mutable = stream
    .map(String::toUpperCase)
    .collect(Collectors.toCollection(ArrayList::new));

集合框架的坑不在 API 多难,而在默认行为随 JDK 版本悄悄变化——尤其是不可变性、并发策略和性能边界这些隐性契约。

热门AI工具

更多
讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

WorkBuddy

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

AionClaw
AionClaw Hot

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

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

豆包大模型

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

DeepSeek

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

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6459

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6459

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3145

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

4048

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

2785

2025.08.29

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

359

2026.04.23

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
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