关于hashmap
-
HashMap的底层数据结构?
数组加键值对,数组默认都为null,新增是计算key的hash值找到数组的位置保存,下一个如果hash如果已存在,则会形成链表
-
HashMap的存取原理?
新增,key和链表长度hash计算得出数组的位置,存放
取值,key和链表长度hash计算得出数组的位置,如果key相等则返回,否则查询链表。
-
Java7和Java8的区别?
jdk7 使用头插法 ,jdk 8 是尾插法,当链表超过阀值会转换成红黑树
-
为啥会线程不安全?
如果是1.7使用头插法,同时多个线程进行插入操作,resize会导致循环链表,就是infineloop。
-
有什么线程安全的类代替么?
concurrenthashmap hashtable
-
默认初始化大小是多少?为啥是这么多?为啥大小都是2的幂?
16 保证2的幂是确保进行位运算是减少hash冲突,保证链表的均匀分布
-
HashMap的扩容方式?负载因子是多少?为什是这么多?
默认扩张为单前数组的两倍,根据key进行重新hash分布, 0.75 过大会频繁冲突,过小会浪费内存
-
HashMap的主要参数都有哪些?
默认初始化大小,超过会进行resize
最大容器大小
默认的负载因子
转换红黑树的阀值
取消红黑树的阀值,即当链表的数目小于这个数是转化为链表而不是红黑树
MIN_TREEIFY_CAPACITY:链表树化的一个标准,前面说过当数组槽内的元素数量大于8时可能会转化为红黑树,之所以说是可能就是因为这个值,当数组的长度小于这个值是,会先去进行扩容,扩容之后就有很大的可能让数组槽内的数据可以更分散一些了,也就不用转化数组槽后的存储结构了。当然,长度大于这个值并且槽内数据大于8时,那就老老实实的转化为红黑树吧。
-
HashMap是怎么处理hash碰撞的?
根据key值计算索引位置,比较key值,如果相同则覆盖并放回旧值,如果不同则存放于当前节点的下一个链表。
-
hash的计算规则?
key & (length-1)