解析hashmap原理主要从结构、存储、线程安全角度进行分析
接口map实现类:
hashmap:
linkhashmap:
treemap:
hashtable:
concurrentHashmap:
结构:
jdk1.7 之前 数组+链表
jdk1.8 后 数组+链表/红黑树
当链表元素个数大于等于8时会自动将链表转为红黑树结构
当删除元素个数为小于等于6时红黑树会自动转为链表
为什么要设置8为转换的临界点:
因为当元素个数为8时,链表的查询复杂度为:8/2=4;而红黑树的查询复杂度为log(8)=3;
所以设置当元素个数为8时转为红黑树。
数组存放节点数据 ,链表存放相同节点地址的数据
扩容 和容量
容量:hashmap初始化的数组容量
构建map传入容量:HashMap map=new HashMap(32);
hashmap 不会完全按照用户自己设置的容量初始化,会按照自己的一定算法生成一个大于当前容量的第一个2的幂等数。
原因:因为hashmap初始化的容量必须要设置为2的幂等,防止用户输入的值不是2的幂等数,通过计算生成一个
构建没有设置默认值:
当没有设置hashmap的默认值时,在构造hashmap时会进行默认容量设置,默认容量设置为16
<