【Java基础知识】HashMap面试会出现的问题

参考地址:https://www.bilibili.com/video/BV14z4y1d7Wa

Java集合容器包含了哪些

  • list
  • map
  • set
    以及实现的诸多子类

list,map是实现了collection接口
map是实现了单独接口,谈到jdk容器时都是放在一起谈

三者在概念上的差别

list是有序的,这个是指插入元素的顺序,可放重复的值和null值
set是无序的,其中的值都是各不相同,只能存放一个null值
map存放entry键值对,键必须是唯一的。

HashMap理解

key值通过hashcode存储
里面数据结构有数组,链表,jdk8中加入的红黑树结构
【Java基础知识】HashMap面试会出现的问题
node点大于8,转换为红黑树。在空间和时间的开销的取舍。
小于6又转换为链表。
【Java基础知识】HashMap面试会出现的问题
【Java基础知识】HashMap面试会出现的问题
transient修饰符,修饰之后不会自动序列化,如果有被这样修饰的参数,会存储到文件中,在反序列化出来会消失。
【Java基础知识】HashMap面试会出现的问题

HashMap的扩容机制

扩容时机:hashmap的默认初始化长度为16,他的负载因子0.75。
threshold = size * loadfactor
当table中的个数,达到了threshold就会扩容,每次扩容都是成倍的。

resize 的长度为2的次幂,这是为了在取模时做优化
% 取模时一个比较耗性能的才操作,而数组长度为2的n次方时,取模就是等于
hash & (length - 1)运算

**重写了hash值:**先右移16位,然后再和hash作异或操作,为了充分利用高位和低位。

为什么length对hash值取模的结果和hash值对length-1做&之后的结果是一样的?
对无符号数的取模和取余时一样的,hash值对2^n取余,就是将hash值的二进制表示右移n位,结果就是商,移动的n位就是余数,当length位2的n次方,则2的n次方-1的二进制表示就等于(n个1)

hashmap不是线程安全的