述一场风花雪月

 

聊聊 HashMap

数据存储底层?

数据底层具体存储是一个Node<K,V> 

 

HashMap 是基于哈希来映射的,那当映射冲突时候怎么解决?

链地址,数组+链表

 

HashMap 什么时候扩容?

负载因子 loadFactor

 

HashMap jdk7和8的区别?

HashMap是数组+链表+红黑树(JDK1.8增加了红黑树部分),链表长度大于8时转化为红黑树

 

HashMap是线程安全的吗?为什么?或者说什么情况下会出现?

不是,在扩容的时候会出现死循环,环形链表

 

HashMap底层数组的长度为什么总是2的n次方?这样设计的意义是什么?

当length总是2的n次方时,h& (length-1)运算等价于对length取模,也就是h%length,但是&比%具有更高的效率。

扩容后,不需要重新计算索引位置,只需要看看原来的hash值新增的那个bit是1还是0就好了,是0的话索引没变,是1的话索引变成“原索引+oldCap”,

 

简单说说根据key获取哈希桶数组索引位置?

取key的hashCode值 h = key.hashCode()

高位运算  h ^ (h >>> 16)

取模运算 h & (length-1);

 

参考:http://www.importnew.com/20386.html

 

posted on 2018-04-14 17:44  述一场风花雪月  阅读(184)  评论(0)    收藏  举报

导航