⭐️前面的话⭐️
本篇文章将介绍Java中HashMap的底层实现原理,有关HashMap为数组开辟内存的时期,默认的容量,默认负载因子,树化的条件,HashMap的扩容机制,put方法的过程以及HashMap中的哈希函数。
📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文由未见花闻原创,CSDN首发!
📆首发时间:🌴2022年8月14日🌴
✉️坚持和努力一定能换来诗与远方!
💭推荐书籍:📚《数据结构》,📚《算法导论》
💬参考在线编程网站:🌐牛客网🌐力扣
博主的码云gitee,平常博主写的程序代码都在里面。
博主的github,平常博主写的程序代码都在里面。
🍭作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!
📌导航小助手📌
1.HashMap以及HashMap的基本原理
1.1什么是HashMap?
HashMap是Java集合框架中Map容器的一个实现类,它的底层是使用哈希表实现的,更加具体地说在jdk7中采用数组+链表实现,在jdk8中采用数组+链表+红黑树实现。
Map代表具有映射关系(key-value)的集合,其所有的key是一个Set集合(key值不能重复),即key无序且不能重复,而HashMap就是Map接口下的一个实现类,HashMap是一个储存键值对(EntrySet)的集合,并且支持储存key/value为null
的元素。
下面我们基于jdk8来说一说HashMap的基本原理。
1.2HashMap的属性
HashMap对象被构造时,初始的默认容量为1<<4
,也就是16
,并且必须是2的幂(这与哈希函数有关)。
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
HashMap最大的容量为1<<30
,也就是 2 30 2^{30} 230。
static final int MAXIMUM_CAPACITY = 1 << 30;
HashMap默认的负载因子为0.75
。
static final float DEFAULT_LOAD_FACTOR = 0.75f;
链表树化的最小链表大小阈值8
,当HashMap中数组大于64
,数组所挂链表的大小超过8
才会将数组所挂的链表转换为红黑树。
static final int TREEIFY_THRESHOLD = 8;
static final int MIN_TREEIFY_CAPACITY