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圈
