hashmap的视线原理:
1:底层使用hash表数据结构,即:数组+链表或红黑树\
数组的默认长度是0,但是第一添加数据长度会变成16;后面扩容的机制是0.75(0.75这个是根据数学的统计学得出的一个结果,过大过小都会降低效率,所以选择了0.75),当数组达到长度的0.75的时候,就会发生扩容,每次扩容都是按2倍放大;
为什么是数组而不是链表,因为数组取余查找特别快,比链表快;
2:添加数据的时候,通过计算key值确定元素在数组中的下标
如果key值相同就会替换
如果不同则会产生冲突就会存入链表或者红黑树中;
(转成红黑树会提升性能,当链表太长的时候,遍历链表的时间复杂度较高,红黑树是LOGn;第二会避免dos攻击;)
获取数据的时候也是通过key的拿到hash值,计算数组下标来获取元素;
Hashmap的JDK1.7与1.8的区别
1:JDK1.8之前是采用拉链法,即数组加链表
(遇到Hash冲突就会将冲突的值加到链表当中,在极端的情况下,如果hash的余数都一样,就会使得链表过长,效率下降;其次1.8之前采用头插法,头插法当遇到多线程扩容的时候可能会引起死循环)
2:JDK1.8之后是采用数组+链表+红黑树,当链表长度大于8并且数组的长度大于64 的时候会从链表转化成红黑树
尾插法(这样就避免了之前的死循环)
(在扩容的时候红黑树的节点数量小于等于6个就会退化成链表)