[Java数据结构和算法] HashMap 和 HashSet

目录

[认识 HashMap 和 HashSet](#认识 HashMap 和 HashSet)

HashMap

构造方法

HashMap源码分析

数组的初始化

put方法

get方法

HashSet

[与 TreeMap/TreeSet 的区别](#与 TreeMap/TreeSet 的区别)

[HashMap 和 TreeMap 的区别](#HashMap 和 TreeMap 的区别)

[HashSet 和 TreeSet 的区别](#HashSet 和 TreeSet 的区别)


认识 HashMap 和 HashSet

HashMap官方文档

HashSet官方文档

HashMap 和 HashSet 是Java中利用哈希表实现的 Map 和 Set。

由于哈希表的 插入/查找/删除 操作的时间复杂度均为 O(1),因此 HashMap 和 HashSet 相关操作的时间复杂度也是 O(1)。

HashMap

构造方法

  1. 无参构造方法

创建一个空的 HashMap,长度为数组默认值16,载荷因子为0.75

  1. 传入指定长度的构造方法

可见该方法内部调用的是带有两个参数的构造方法(一个是传入的指定长度值,一个是默认的载荷因子)

  1. 带有两个参数的构造方法

该构造方法将指定的原来默认的载荷因子改成传入的指定载荷因子,然后将传入的指定数组长度改成2的幂次(比如传入的指定长度为10,返回的值是16,因为16是2的4次方)

  1. 传入一个Map的构造方法

所创建的HashMap中将包含所传入的Map中的所有元素。

HashMap源码分析

数组的初始化

若调用无参构造方法,默认的数组长度是16.

当调用put方法,会计算value的哈希值,并且给数组table分配内存

调用put方法后,会给数组分配默认内存大小,为16。

put方法

get方法

若getNode返回的为空,表示没有找到,返回空;若返回一个节点,则返回该节点的value。

以下是具体操作图示:

HashSet

和 TreeSet 底层是 TreeMap 一样,HashSet 的底层也是 HashSet。

它的四个构造方法都是通过 HashMap 来实现的。

  1. 无参构造方法
  1. 传入指定数组长度的构造方法
  1. 传入指定数组长度和载荷因子的构造方法
  1. 传入一个集合的构造方法

add 和 remove 等操作也都是通过 Map 的操作来实现的

与 TreeMap/TreeSet 的区别

HashMap 和 TreeMap 的区别

|----------------|------------------------------|--------------------------------------|
| Map | HashMap | TreeMap |
| 底层结构 | 哈希桶 | 红黑树 |
| 插入/查找/删除的时间复杂度 | O(1) | O(log₂N) |
| 插入/查找/删除的区别 | 通过哈希函数计算哈希地址 | 需要进行元素间的比较 |
| 数据是否有序 | 无序 | 关于Key有序 |
| 线程是否安全 | 不安全 | 不安全 |
| 比较与覆写 | 自定义类型需要覆写equals方法和hashCode方法 | Key必须是可比较的,否则会抛出ClassCastException异常 |
| 使用场景 | 不关心Key是否有序,只关心时间性能 | 需要Key有序 |

HashSet 和 TreeSet 的区别

|----------------|------------------------------|--------------------------------------|
| Map | HashSet | TreeSet |
| 底层结构 | 哈希桶 | 红黑树 |
| 插入/查找/删除的时间复杂度 | O(1) | O(log₂N) |
| 插入/查找/删除的区别 | 通过哈希函数计算哈希地址 | 按照红黑树的性质进行操作 |
| 数据是否有序 | 不一定有序 | 关于Key有序 |
| 线程是否安全 | 不安全 | 不安全 |
| 比较与覆写 | 自定义类型需要覆写equals方法和hashCode方法 | Key必须是可比较的,否则会抛出ClassCastException异常 |
| 使用场景 | 不关心Key是否有序,只关心时间性能 | 需要Key有序 |

感谢观看!希望读者朋友们能够学到东西。

若有不对的,请尽管指出 ~


相关推荐
roman_日积跬步-终至千里4 分钟前
【LangGraph4j】LangGraph4j 核心概念与图编排原理
java·服务器·数据库
野犬寒鸦26 分钟前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
wenzhangli726 分钟前
ooderA2UI BridgeCode 深度解析:从设计原理到 Trae Solo Skill 实践
java·开发语言·人工智能·开源
HalvmånEver29 分钟前
Linux:线程互斥
java·linux·运维
rainbow688936 分钟前
深入解析C++STL:map与set底层奥秘
java·数据结构·算法
灵感菇_40 分钟前
Java 锁机制全面解析
java·开发语言
indexsunny40 分钟前
互联网大厂Java面试实战:Spring Boot微服务在电商场景中的应用与挑战
java·spring boot·redis·微服务·kafka·spring security·电商
娇娇乔木1 小时前
模块十一--接口/抽象方法/多态--尚硅谷Javase笔记总结
java·开发语言
saber_andlibert1 小时前
TCMalloc底层实现
java·前端·网络
wangjialelele1 小时前
平衡二叉搜索树:AVL树和红黑树
java·c语言·开发语言·数据结构·c++·算法·深度优先