0

0

什么是Java中的集合框架_Collection与Map接口体系结构概览

P粉602998670

P粉602998670

发布时间:2026-03-12 14:04:42

|

556人浏览过

|

来源于php中文网

原创

ArrayList适用于读多写少、随机访问频繁的场景;LinkedList适合头尾高频增删;HashSet用于去重且无需顺序;TreeSet要求有序去重;LinkedHashSet保留插入顺序。

什么是java中的集合框架_collection与map接口体系结构概览

Collection 接口下有哪些常用实现类,各自适用场景是什么

ArrayListLinkedListHashSetTreeSetLinkedHashSet 是最常被选中的几个。它们不是凭空并列的,选择取决于你到底在操作什么。

  • ArrayList:底层是数组,随机访问快(get(int) 是 O(1)),但插入/删除中间元素慢(要移动后续元素);适合读多写少、按索引频繁访问的场景
  • LinkedList:双向链表,头尾增删快(O(1)),但按索引查元素慢(O(n));别只因“链表”二字就用它——除非真在大量做 addFirst()removeLast()
  • HashSet:基于 HashMap 实现,依赖 hashCode()equals(),不保证顺序,插入和查找平均 O(1);去重首选,但对象必须正确重写那两个方法
  • TreeSet:基于红黑树,自动排序(要求元素实现 Comparable 或传入 Comparator),查找/插入是 O(log n);需要有序且去重时才用,别为了“看起来整齐”硬套
  • LinkedHashSet:哈希表 + 链表,保留插入顺序,性能略低于 HashSet;调试时看元素添加顺序、或需稳定遍历顺序时有用

常见错误:把 ArrayList 当队列用 remove(0),结果每次都是 O(n);该用 ArrayDeque 的地方没换。

Map 接口的关键实现里,key 为 null 的行为差异

HashMapLinkedHashMapConcurrentHashMapTreeMapnull key 的容忍度完全不同,这直接影响你能否安全地存 null

  • HashMapLinkedHashMap 允许一个 null key(put(null, "v") 合法),get(null) 也能返回对应 value
  • ConcurrentHashMap 禁止 null key 和 null value,否则直接抛 NullPointerException;这是线程安全代价之一,不是 bug
  • TreeMap 不允许 null key(除非构造时传了 Comparator 且该比较器能处理 null),否则在 put() 时就报 NullPointerException

使用场景提示:如果业务逻辑中 key 可能为 null,又需要并发安全,别硬改 ConcurrentHashMap,考虑用 Optional 包装 key,或者预处理掉 null

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

Favird No-Code Tools
Favird No-Code Tools

无代码工具的聚合器

下载

为什么不能直接用 == 比较 Collection 或 Map 中的元素

因为 == 比的是引用地址,而集合框架的设计契约是:判断相等必须用 equals()。几乎所有标准方法(contains()remove()containsKey() 等)内部都调用 equals(),不是 ==

  • 常见错误现象:往 HashSet 里加了字符串 "abc",再用另一个字面量 "abc"contains() 返回 true(看似正常),但换成自定义对象后始终返回 false——大概率是忘了重写 equals()hashCode()
  • 参数差异:即使两个对象字段值完全一样,只要没重写 equals(),默认继承自 Object,仍比较地址
  • 性能影响:重写不当会破坏哈希分布,比如 hashCode() 总返回固定值,会让 HashMap 退化成链表,查找从 O(1) 变 O(n)

简单验证方式:打印 obj1.equals(obj2)obj1 == obj2 的结果对比,尤其在单元测试里加这一行。

迭代过程中修改集合导致 ConcurrentModificationException 怎么避开

这个异常不是多线程专属,单线程遍历时用 for-eachiterator.next() 并同时调 list.remove() 就会触发。

  • 根本原因:集合内部有 modCount 计数器,迭代器创建时记录快照值,每次操作集合都会更新它;迭代器每次 next() 前校验是否匹配,不匹配就抛异常
  • 正确做法只有两种:
    • 用迭代器自己的 remove() 方法(如 it.remove()),它会同步更新计数器
    • 收集待删元素,遍历完再批量删(list.removeAll(toRemove)
  • 别踩的坑:
    • for (int i = 0; i 循环中删元素,不调整 <code>i 会导致跳过下一个元素
    • ConcurrentHashMap 虽然名字带 concurrent,但它的 entrySet().iterator() 仍是弱一致的——不抛异常,但可能看不到最新修改,也不保证反映全部当前状态

真正需要高并发修改的场景,优先考虑 CopyOnWriteArrayList(读多写少)或分段加锁策略,而不是靠“绕过异常”来掩盖设计问题。

集合体系的复杂点不在接口多,而在每个实现类都带着明确的时空权衡和契约约束。漏掉一个 hashCode() 重写,或误判了 null key 的支持范围,线上就可能出 silent fail。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

254

2023.09.22

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

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

1089

2024.03.01

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

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

760

2023.08.03

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

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

221

2023.09.04

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

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

1566

2023.10.24

字符串介绍
字符串介绍

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

649

2023.11.24

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

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

1228

2024.03.22

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

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

1204

2024.04.29

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

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

精品课程

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

共23课时 | 4.3万人学习

C# 教程
C# 教程

共94课时 | 11.2万人学习

Java 教程
Java 教程

共578课时 | 81万人学习

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

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