HashMap原理
2023-12-29 18:36:27 0 举报
HashMap是一种基于哈希表的数据结构,它实现了Map接口,用于存储键值对(key-value)数据。HashMap的核心原理包括哈希函数、数组和链表。每个元素通过哈希函数计算得到一个唯一的哈希值,这个哈希值决定了元素在数组中的存储位置。当多个元素哈希值相同时,它们将被存储在同一个链表中,这种情况被称为哈希冲突。HashMap通过扩容来提高性能,当元素数量达到阈值时,HashMap会自动扩容,使得元素更均匀地分布在数组中,减少哈希冲突。此外,HashMap是非线程安全的,在多线程环境下需要使用ConcurrentHashMap来保证线程安全。
作者其他创作
大纲/内容
N
遍历链表对比key,查看是否有相同的key去替换其value
说明是红黑树
Y
找的方法和put时候找Node方法一样
removeNode
put
判断Node对象是否是TreeNode类型
找到对应节点删除
调用方法putMapEntries来放入map的元素到数组table中
调用方法treeifyBin来判断是否要转换为红黑树
先找到对应的Node对象
根据key的hash和table长度-1取与,得到其数组下标
说明是红黑树结构
插入数据
通过比对key的hash值来查找节点或者插入新节点到对应位置
根据传入的默认数组大小,调用方法tableSizeFor来计算出数组真正需要的大小
remove
保存传入的数组大小和负载因子
注意常规初始化不会实例化数组table
putVal
如果table还没初始化,先调用方法resize方法来初始化table
遍历map,针对每个元素调用putval方法来插入Node
实例化时候传入已有map
对key做hash,利用hash值对数组table长度取余,决定其在数组中的下标
找到其对应元素返回,没找到,则返回Null
对应下标中的节点对象是否为Null
一般不传负载因子,用系统自带的比较好
putMapEntries
根据当前数组大小判断是否需要扩容
常规实例化
实例化Node对象,保存Key和value
说明是链表结构
如果没有则新建一个node插入到链表末尾
注意map中扩容都是2倍扩容,数组长度也永远是2的倍数,所以对于自己传入的大小要进行处理
调用resize方法实例化数组table
getNode
get
重新平衡红黑树
Node对象是TreeNode对象?
new HashMap
调用resize方法扩容
0 条评论
下一页
为你推荐
查看更多