集合类结构
- 集合类的基本接口是
Collection
和 Map
Collection
向下派生出 Set
List
Queue
等接口
Map
向下派生出 HashMap
LinkedHashMap
TreeMap
等实现类
Collection
- Set代表无序的,元素不可重复的集合;
- List代表有序的,元素可以重复的集合;
- Queue代表先进先出(FIFO)的队列。
List 和 Set 的区别
- 有序性
- List 集合中存储的元素是有序的。集合中的元素按照存储的先后顺序排序。
- Set 集合中存储的元素是无序的。
- 可重复性
- List 集合中可以存储重复元素,同样允许多个NULL值的存在。
- Set 集合不能存储重复元素,只能存在一个NULL值。
- 迭代方式
- List 集合可以使用迭代器遍历,也可以通过索引进行查询和遍历
- Set 集合只能使用迭代器获取和遍历集合中的元素
ArrayList 和 LinkedList 的区别
- 实现结构
- ArrayList 是基于数组结构实现的,因此是使用连续的存储空间进行数据存储。
- LinkedList 是基于链表结构实现的,因此存储数据可以分散在内存空间中。
- 查询效率
- ArrayList 是数组实现,可以直接通过下标查询到目标数据,因此时间复杂度为O(1)
- LinkedList 是链表实现,需要通过遍历链表中的节点查找目标数据,因此时间复杂度为O(n)
Map
HashMap 源码分析
存储结构
- JDK1.7 中的 HashMap,是基于数组+链表来实现的,它的底层维护一个Entry数组,数组中的每个元素都是一个链表头节点。
- 当出现哈希冲突时,新插入的元素会被添加到数组索引所在链表上(插入头部)。
- 存在的问题是,当哈希冲突严重时,链表的长度过长,导致查询的效率下降。
- 注意,JDK1.7 在多线程环境下可能出现链表成环的问题
- JDK1.8 中的 HashMap,是基于数组+链表+红黑树来实现的,它的底层维护一个Node数组。
- 在1.8中引入红黑树结构,目的是解决哈希冲突严重时查询效率低的问题,链表为O(N),而红黑树一直是O(logN)。
- 当数组的长度大于64,同时链表的节点个数大于等于8的时候,链表会转为红黑树
- 当链表的节点数低于6时会将红黑树转回链表
- 注意在 JDK1.8 中插入数据是尾插法
添加元素流程
- 计算索引
- 计算对象(key)的哈希值,根据哈希值计算索引位置,计算方法为取余
hash % n = (n-1) & h
- 插入数据
- 若数组在该索引位置为空,则创建一个节点将该数据存入索引位置;
- 若数组在该索引位置不为空,则遍历该索引位置对应的链表,调用 equals() 方法判断是否存在;
- 若发现重复元素,则覆盖重复数据;
- 若没有重复元素,则在链表尾部插入数据;
- 注意,当链表长度达到8时,若数组长度不足64,则会先触发扩容机制,否则会将链表转化为红黑树
扩容机制
- 扩容触发条件
- 数组是否需要扩充是通过负载因子判断的,负载因子默认值为0.75,如果数组已用空间达到0.75时会触发自动扩容。
- JDK1.8 当链表长度达到8时,也会先触发扩容机制。
- 扩容方式
- 默认情况下,初始化的数组长度为16,每次以2的整数次扩容。
- 使用2的整数次扩容的目的是使用位运算代理与运算,提高哈希计算索引的效率,当n是2的整数次方时,
hash % n = (n-1) & h
HashMap 和 HashTable 区别
- 线程安全性
- HashMap 是线程不安全的。
- HashTable 是线程安全的,通过在 HashMap 方法的基础上添加 synchronized 关键字来保证线程安全。
- 空值问题
- HashMap 的 key 可以是 null,而 HashTable 的 key 不允许是 null。
- 扩容算法不同
- HashMap 的初始容量为16,扩容时 *2
- HashTable 的初始容量是11,扩容时 *2 + 1
posted @
2022-06-05 16:52
infinite-sky
阅读(
32)
评论()
编辑
收藏
举报
点击右上角即可分享
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异