源码分析:LinkedList/ /源码分析:JDK1.7的HashMap
LinkedList:
1.内部实现:链表
记录Node first
Node last
2.add(xx)
默认添加到链表的尾部linkLast(xx)
3.add(int index,xx)
4.remove(xx)
JDK1.7及之前:HashMap的底层实现是数组+链表。
(1)数组的元素类型是什么
Map.Entry接口的类型(key,value)
HashMap.Entry内部类类型,实现了Map.Entry(key,value,next)
(2)为什么要有链表
计算每一对映射关系的key的哈希值
然后根据哈希值决定存在table数组[index]
情况一:两个key的哈希值一样,但是equals不一样,最终计算的index相同
情况二:两个key的哈希值不一样,equals也不一样,但是通过公式运算后,index相同。
那么table[index]中无法存放两个对象,所以只能设计为链表的结构,把它们串起来。
(3)数组的初始化长度是多少?
初始化长度默认为16
如果手动指定,那么也必须是2的n次方,如果不是会自动纠正。
(4)数组是否会扩容?
会
什么情况下会扩容?
有一个变量threshold达到临界值时,就会考虑扩容,还要看当前添加(key,value)时,是否table[index]==null,如果table[index]!=null那么就会扩容,如果table[index]==null,那么本次先不扩容。
DEFAULT_LOAD_FACTOR:默认加载因子为0.75
threshold = table.length * 0.75
第一次:16 * 0.75 = 12,当我们size达到12个,就会考虑扩容。
(5)index如何计算?
拿到一个key的哈希值之后,如何计算[index]
(1)key是null,固定位置[index] = [0]
(2)第一步,先用hashCode值通过hash(key)函数得到一个比较分散的“hash值”;
第二步,再根据“hash值”与table.length做运算得到index
hash & table.length-1按位与 确保index在[0,length-1]范围内。
(6)如何避免key不重复的?
换句话说,如果key重复了,会怎么办?
如果key相同,那么我们会替换旧的value
key相同:先判断hash值,如果hash值相同,判断key的地址或equals是否相等。
(7)新的(key,value)添加到table[index]后,发现table[index]不为空,怎么连接的?
(key,value)是作为table[index]的头,原来下面的元素作为我的next。