Java源码-关于HashMap

看了敖丙的吊打系列,总结的一些hashmap必备的知识点
 
[]底层数据结构?
数组+链表(数组默认为null, 新增时如果hash已存在则形成链表---为什么需要链表)
[]存取原理?
存:通过key和链表长度hash计算得到数组位置
取:通过key和链表长度hash计算得到数组位置,如果key相等返回,否则查询链表
[]默认初始化大小?为什么16?都是2的幂?
默认16;保证链表的均匀分布;2的幂是确保进行位运算见少hash冲突
[]扩容方式?负载因子?为什么0.75?
默认为当前数组的两倍;0.75;过小浪费内存,过大会频繁冲突
[]jdk7和8的区别?
jdk7是头插法,数组+单链表;jdk8是尾插法,当链表超过阈值(8)会转换成红黑树
[]链表转红黑数优势?
将原本7的O(N)时间复杂度降低到O(logN)
[]为什么改为尾插法?
数组容量有限,达到一定容量会进行扩容(resize),而jdk7中扩容需重新计算hash和索引位置,而8尾插法扩容时保持链表原本顺序,不会出现链表成环的问题
[]为什么阈值为8?
泊松分布桶的长度概率分布取到8作为阈值
[]线程安全?
不安全,因为hashMap的put/get方法都没有同步锁,无法保证读写一致
[]有什么线程安全的类代替?
hashtable:方法上锁,简单粗暴,并发低
currenthashmap:线程安全的前提下,并发高
[]主要参数?
默认初始化大小,超过resize
最大容器大小
默认负载因子
红黑树阈值
[]hash碰撞的处理?
根据key计算索引位置,如果key相同则覆盖,不同则存放在当前节点的下一个链表
[]hash的计算规则?
key & (length - 1)
posted @ 2020-08-11 16:08  空指针终结者  阅读(214)  评论(0)    收藏  举报