话不多说,直接看题
1.JDK1.7版本,HashMap的数据结构是什么?
答:数组加单向链表
2.什么叫做Hash桶
答:数组中的单向链表
3.HashMap的数组长度为什么必须是2的幂?
答:因为在计算元素下标(索引)时是根据hash&数组长度-1,如果不是数组长度不是2的幂,那么数组长度-1的二进制额某一位可能不是一,就会出现某些下标永远存不到数据
4.HashMap的默认负载因子是多少,作用是什么?
答:默认的负载因子是0.75,,作用是数组长度*负载因子=阈值(扩容条件)
5.HashMap的默认负载因子为什么是0.75?
答:官方解释是时间与空间的平衡
如果负载因子过大,就会牺牲时间,利用空间
如果负载因子过小,就会牺牲空间,利用时间
6.HashMap数组最大长度是多少?
答:1<<30
7.HashMap数组最大长度为什么是1 << 30?
答:因为HashMap的数组长度必须是2的幂,而数组的最大长度是int类型,即Integer.Max,Integer.Max为1<<31 - 1,所以HashMap的数组长度只能是1<<30
8.什么叫做Hash碰撞/冲突?
答:hash值相同,则计算出的下标就相同,这样就造成了hash碰撞
9.HashMap何时扩容?
答:当元素个数>=阈值时就会扩容
10.HashMap扩容机制是什么?
答:原来的两倍
11.HashMap存入null键的位置?
答:下标为0的地方
12.什么叫做Hash回环?
答:在多线程模式下,当一个线程不断的遍历集合,另一个线程不断的添加数据,添加数据就会扩容,则就会出现hash回环。
注意:Hash回环参数完全就该程序员背锅,因为HashMap中明确说明了HashMap不是一个线程安全的
13.JDK1.7版本和JDK1.8版本的HashMap的区别
答:1.7中HashMap底层是数组+单向链表
且单向链表中插入元素是用头插法
1.8中HashMap底层是数组+单向链表+红黑树
且单向链表中插入元素是用尾插法
1.7中是运用散列算法计算hash值,而1.8中是通过低16^高16位计算hash值,使其更加散列
14.JDK1.8版本HashMap为什么添加红黑树的数据结构?
答:因为链表查询慢,红黑树查询快
15.JDK1.8版本什么时候由数组+链表变成数组+红黑树
答:当链表的长度>8且数组元素>64就会由链表转换为红黑树