千锋教育Java入门全套视频教程(java核心技术,适合java零基础,Java
2023-07-22 10:45 作者:Cloud-yunduo | 我要投稿

- JDK1.7版本的HashMap的数据结构是什么?
一维数组+单向链表
- HashMap默认初始化容量是多少?
1<<4 -- 16
- HashMap容量为什么必须是2的幂?
获取元素在数组中的下标是 元素的hash值&数组的长度-1
如果数组的长度不是2的幂,-1就会导致二进制中的某几位都是0,和元素的hash值做&运算,二进制上的某几位就永远是0,最终导致下标分布不均匀,浪费空间
- HashMap最大容量是多少?
1<<30 -- 1073741824
- HashMap最大容量为什么是1<<30?
HashMap容量为int类型,而且容量必须是2的幂
1<<30 是int取值范围内最大的二的幂的数字
- HashMap默认的负载因子是多少?
0.75f
- HashMap默认的负载因子为什么是0.75f?
取得了时间和空间的平衡
如果负载因子过大,利用了空间,浪费了时间
如果负载因子过小,利用了时间,浪费了空间
- 什么叫做Hash冲突/碰撞?
多个元素的hash值一样,在数组中的下标也是一样的
- 怎么避免hash冲突?
根据对象判断标准,重写hashCode和equals即可
- HashMap何时扩容?
如果映射关系个数大于等于阈值 并且 当前下标上的元素不为null,就扩容
- HashMap存放null键的位置在哪?
存放在下标为0的位置
- HashMap扩容机制是什么?
是原来长度的2倍
- JDK1.7版本的HashMap和JDK1.8版本的HashMap有何区别?
JDK1.7的HashMap
数据结构:一维数组+单向链表
计算hash值:位运算
单向链表插值法:头插法
JDK1.8的HashMap
数据结构:一维数组 + 单向链表 + 红黑树
一维数组 + 单向链表 -- 链表长度>8 && 数组长度 > 64 --> 一维数组+红黑树 (目的:提高查询效率)
一维数组 + 红黑树 -- 红黑树节点 < 6 --> 一维数组 + 单向链表
计算hash值:高16位 ^ 低16位(计算更加散列的hash值)
单向链表插值法:尾插法