Java 面试问题系列五(HashMap)

1、HashMap的原理,内部数据结构?

底层使用哈希表(数组 + 链表),当链表过长会将链表转成 红黑树以实现 O(logn) 时间复杂度内查找

2、讲一下 HashMap 中 put 方法过程?

对 Key 求 Hash 值,然后再计算 下标。

如果没有碰撞,直接放入桶中,

如果碰撞了,以链表的方式链接到后面,

如果链表长度超过阀值(TREEIFY_THRESHOLD == 8),就把链表转成红黑树。

如果节点已经存在就替换旧值

如果桶满了(容量 * 加载因子),就需要 resize。

3、HashMap 中 hash 函数怎么是是实现的? 还有哪些 hash 的实现方式?

高 16bit 不变,低 16bit 和高 16bit 做了一个异或

(n - 1) & hash --> 得到下标

还有哪些 Hash 实现方式?

4、HashMap 怎样解决冲突,讲一下扩容过程,假如一个值在原数组中,现在移动了新数组,位置肯定改变了,那是什么定位到在这个值新数组中的位置,

将新节点加到链表后,

容量扩充为原来的两倍,然后对每个节点重新计算哈希值。

这个值只可能在两个地方,一个是原下标的位置,另一种是在下标为 <原下标+原容量> 的位置。

5、抛开 HashMap,hash 冲突有那些解决办法?

开放定址,链地址法

6、针对 HashMap 中某个 Entry 链太长,查找的时间复杂度可能达到 O(n),怎么优化?

将链表转为红黑树, JDK1.8 已经实现了。

7、HashMap ,HashTable 区别

8、HashMap、ConcurrentHashMap 区别。

ConcurrentHashMap 两个 hash 过程,第一次找到所在的桶,并将桶锁定,第二次执行写操作。

9、ConcurrentHashMap原理,jdk1.8 后有哪些改变?

关注重庆java圈


你可能感兴趣的:(Java 面试问题系列五(HashMap))