. HashMap 的原理,内部数据结构?
- 底层使用哈希表(数组 + 链表),当链表过长会将链表转成 红黑树以实现 O(logn)
时间复杂度内查找
- 讲一下 HashMap 中 put 方法过程?
- 对 Key 求 Hash 值,然后再计算 下标。
- 如果没有碰撞,直接放入桶中,
- 如果碰撞了,以链表的方式链接到后面,
- 如果链表长度超过阀值(TREEIFY_THRESHOLD == 8),就把链表转成红黑树。
- 如果节点已经存在就替换旧值
- 如果桶满了(容量 * 加载因子),就需要 resize。
- HashMap 中 hash 函数怎么是是实现的? 还有哪些 hash 的实现方式?
- 高 16bit 不变,低 16bit 和高 16bit 做了一个异或
- (n - 1) & hash --> 得到下标
- 还 有 哪 些 Hash 实 现 方 式 : 可 以 参 考 之 前 的 博 客 Effective Java 学 习 笔 记 --
hashCode() - HashMap 怎样解决冲突,讲一下扩容过程,假如一个值在原数组中,现在移动了新数组,
位置肯定改变了,那是什么定位到在这个值新数组中的位置,
- 将新节点加到链表后,
- 容量扩充为原来的两倍,然后对每个节点重新计算哈希值。
- 这个值只可能在两个地方,一个是原下标的位置,另一种是在下标为 <原下标+原容
量> 的位置。
- 抛开 HashMap,hash 冲突有那些解决办法?
- 开放定址,链地址法
- 针对 HashMap 中某个 Entry 链太长,查找的时间复杂度可能达到 O(n),怎么优化?
- 将链表转为红黑树, JDK1.8 已经实现了。
- 数组和 ArrayList 的区别;
- 数组可以包含基本类型和对象类型,ArrayList 只能包含对象类型
- 数组大小固定,ArrayList 大小可以动态变化