HashTable和HashMap的区别:
1、HashMap 线程不安全,可以放空key(只能放一个)
2、HashTable 线程安全,不可以放空key
存放空Key的hash值放在数组的哪个位置上:
存放在下标为0的位置上,也就是第一个链表的位置
HashMap1.7和HashMap1.8有什么区别:
1.7 底层用的是数组+链表实现的
1.8 底层用的是数组+链表+转换红黑树实现的
HashMap是如何解决Hash冲突问题的:
使用链表存放hash值相等且内容不等,存放在统一个链表中
HashMap的put方法底层是如何实现:
1、判断key如果为空的情况下,存放数组0
2、默认HashMap初始容量为16、负载因子大小 16*0.75 = 12 , 每次扩容 2 倍
3、根绝key计算hash值,存放到数组下标等于hash值的位置
4、如果计算出的hash值的位置已经存在数据(hash冲突),但是内容不等,则通过链表进行存储
5、如果当前size > 负载因子阈值,开始*2扩容
备注:1.8 中链表长度如果大于8的情况下,开始将链表转换为红黑树
为什么负载因子是0.75:
空间利用率高、冲突少、0.75最合适
HashMap 1.7中数组扩容死循环的问题: