【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中加入的红黑树结构
node点大于8,转换为红黑树。在空间和时间的开销的取舍。
小于6又转换为链表。
transient修饰符,修饰之后不会自动序列化,如果有被这样修饰的参数,会存储到文件中,在反序列化出来会消失。
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不是线程安全的