浅谈HashMap,HashTable,ConcurrentHashMap,WeakHashMap,HashMap源码分析
HashMap概述
哈希表也称为散列表,是根据关键码值来确定数据的位置进行访问以提高查询速度,这种映射关系(函数)称为散列函数,存放数据的数组称为散列表。
它的数据存储形式是以键值对(key-value)的形式存储的,散列表的数据结构是数组+链表的形式。
哈希函数
哈希表的节点内部类存放的有数据,指向下一个节点的引用,以及哈希码,这个哈希码的作用就是将这个节点和它的存放位置做一个对应关系,那么这个对应关系就是哈希函数。
比如哈希函数式为:f(x) = x mod 7,那么就是将该节点中的hash码模7,得到的结果就是该节点在散列表中的下标位置。
选择一个好的哈希函数,可以减少哈希冲突的发生,但是哈希冲突无法避免。
哈希冲突
无论如何选择哈希函数,都无法避免哈希冲突,即同一个映射关系,不同的hash码会获得同一个散列表存储位置,要解决哈希冲突,有一种方法为链地址法,即如果发生哈希冲突,就将同一个位置的节点以链表的格式链在第一个节点后面,搜索时,如果同一个位置有多个节点,那么将搜索该链表,直到找到为止。
还有解决办法,如开放地址法,公共溢出法,再哈希法。
HashMap源码浅解析
HashMap类位于util工具包中。

它的父类是AbstractMap类,实现了Map,Cloneable(可克隆的),Serializable(可序列化的)接口。
常量属性

DEFAULT_INITIAL_CAPACITY常量是散列表的默认初始化大小,大小是1<<4,即16。

这里注释了大小必须是2的幂次方,为什么?

MAXIMUM_CAPACITY常量是散列表的最大容量,大小是1<<30,即1073741824。

DEFAULT_LOAD_FACTOR常量是散列表的默认负载因子,如果插入的数据量大于数组的length乘负载因子,那么数组将扩容。

TREEIFY_THRESHOLD常量和UNTREEIFY_THRESHOLD常量用于界定链表和红黑树结构的转换。在解决

本文详细解析了HashMap、HashTable、ConcurrentHashMap等数据结构的工作原理,包括哈希函数、哈希冲突解决策略、源码分析及使用技巧,特别关注HashMap的内部机制、性能优化及线程安全性。
745

被折叠的 条评论
为什么被折叠?



