HashMap常见面试题:
HashMap的底层数据结构?
数组,链表,和一个红黑树
HashMap的存取原理?
根据hashcode找到对应的bucket之后,如果key为null,bucket的下标为
如果bucket为空,直接新建个节点
如果bucket == key,覆盖原来的值;如果bucket的节点为树节点类型,则走红黑树
遍历链表,如果找到相同的key,则覆盖原来值,并返回;在链表后边插入一个新的节点
判断容量是否大于阈值,扩容
Java7和Java8的区别?
为啥会线程不安全?
有什么线程安全的类代替么?
默认初始化大小是多少?为啥是这么多?为啥大小都是2的幂?
HashMap的扩容方式?负载因子是多少?为什么是这么多?
容量扩充为原来二倍,采用尾节点插入法,保存链的信息。(尾部插入,防止构建循环链表,让cpu 100%)
HashMap的主要参数都有哪些?
1
2
3
4int threshold; // 扩容阈值
final float loadFactor; // 负载因子
transient int modCount; // 出现线程问题时,负责及时抛异常
transient int size; // HashMap中实际存在的Node数量
HashMap是怎么处理hash碰撞的?
哈希表为解决冲突,可以采用开放地址法和链地址法等来解决问题,Java中HashMap采用了链地址法
hash的计算规则?
1
(key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);