1.数据结构:存储数据的一种方式。 java1.8前:链表+数组 , java1.8后:链表+数组+红黑树,数组默认长度是16。
2.hashMap可以存键值对,也可以存null,是存在数组的0角标上的
3.存取都是无序的。
4.java1.8前,构造方法中创建的是大小为16的Entry数组,java1.8是第一次put时创建Node数组来存储键值对数据。
5.底层采用的key的hashCode方法的值结合数组长度进行无符号位移(>>>)、按位异或(^)、按位与(&)计算出索引,还可以采用平方取中法,取余数、伪随机树法(其中位运算效率更高)。
6.当调用hashCode方法结合数组长度计算出来的索引如果在数组中存在,再判断hash值是否相等,如果相等,此时发生hash碰撞,然后会调用对象中的equals来判断对象是否相等,如果相等,第二次的的值直接覆盖第一次的value值,如果不相等,会向下与链路比较其他key,如果都不相等,规化出一个节点存储数据,java1.8后,会判断链表大于8并且数组角标大于64启用红黑树,变成红黑树为了高效的查询。
7.HashMap继承AbstractMap实现了Map接口,同时实现了克隆和序列化接口。
8.HashMap的数组长度都是2的n次幂,如果不是2的n次幂,计算处理的索引容易相同,容易发生hash碰撞,会造成其他数组空间没有存储数据,链表或红黑树过长,效率降低。
9.数组默认长度位16,加载因子为0.75 16*0.75=12,所以当数据存储的数量大于12,就会扩容。
10.为什么红黑树在长度为8时才转为红黑树? 因为红黑树占用空间是链表的2倍,选择8是符合泊松分布(统计学的概率分布)。
11.加载因子:用衡量Hash满的程度,默认值时0.75f。
12.红黑树的左旋右旋,红黑树必须平衡,不平衡会左旋右旋重组成平衡二叉树。
13,扩容后,原来数据角标的数据在新数组中,要么是原角标,要么是原角标+原数组的长度(比如原数组角标4,扩容后在新数组角标是4或20(16+4))
Java中HashMap面试详答
于 2023-05-03 14:40:13 首次发布
HashMap是Java中用于存储键值对的数据结构,它使用链表和数组结合的方式,在Java1.8后引入了红黑树提高查询效率。HashMap无序且可存null,其容量为2的n次幂,加载因子默认为0.75。当链表长度超过8且数组长度超过64时,会将链表转换为红黑树,以减少查找时间。扩容时,旧数据会在新数组的原角标或原角标+原数组长度的位置。
摘要由CSDN通过智能技术生成