微信搜索《Java鱼仔》,每天一个知识点不错过
(一)每天一个知识点
说一下 HashMap 的实现原理?
(二)结论
(2.1)HashMap的特点
HashMap底层是一个哈希表,以数组加链表的形式存储值。HashMap具有以下特点:
1.HashMap允许key和value为空
2.HashMap是线程不安全的
3.HashMap的初始容量为16,负载因子大小为0.75
4.在jdk7.0中,底层是数组加链表;在jdk8.0中,底层是数组加链表加红黑树
(2.2)HasnMap的put操作
HashMap中维护了Node类型的数组table,当HashMap创建对象时,设置负载因子为0.75,table还是null。
当第一次添加元素时,将table的容量设置为16,临界值设置为12
每次添加元素调用putVal方法:
1.将key的hash值和table容量-1进行与运算,得到索引值
2.判断该存放位置上是否有元素,如若没有元素则直接放上去;如果该索引位置已存在元素,则继续判断
3.如果该位置的元素和添加元素相等,则直接覆盖,如果不相等,则继续判断是链表结构还是树状结构,按照相对应的方式添加。
如果添加的数量大于临界值,执行resize方法对容量双倍扩容。并打乱顺序重新排列。
(三)再多学一点
我专门写了一篇博客对HashMap、HashTable、TreeMap的底层源码进行分析和对比,大家可以看下: