-
HashMap的原理?内部数据结构?
- HashMap底层它是有哈希表组成,当链条过长时,将会转化为红黑树结构
-
HashMap中put方法的过程是怎样实现的?
- 对key求hash值,然后再计算下标
- 如果没有碰撞,直接放入数组中
- 如果碰撞了,就根据key判断是否存在于链表中,存在则直接覆盖值,不存在则以链表的方式链接到后面
- 如果桶满了(容量*加载因子),那么就需要调用resize方法进行扩容
-
- 当链表的长度>=8且数组长度>=64时,会把链表转化成红黑树。
-
当链表长度>=8,但数组长度<64时,会优先进行扩容,而不是转化成红黑树。
-
当红黑树节点数<=6,自动转化成链表
-
HashMap中hash函数是怎样实现的?
- 高16bit不变,低16bit和高16bit做了一个异或
- 通过(n-1)&hash 得到对应的下标
-
HashMap是怎样扩容的呢?
- 在resize方法里,首先通过(容量*加载因子)计算出下一次扩容所需要达到的条件
- 当在putVal,如果对应长度达到了扩容的条件那么就会再次调用resize方法,通过 原长度<<1 移位操作 进行扩容
- 而对应的扩容条件也会跟随这 原扩容因子<<1 移位操作
-
HashMap中某个Entry链太长,查找时间复杂度可能达到O(n),怎么优化?
- 其实上面已经答了,就是将链表转化为红黑树操作!