HashMap相关问题

数组下标运算

HashMap中的下标是通过hash值与(length - 1)进行与运算获得的,例如hash&1111(15)。

位运算的效率比取余效率更高。

数组长度

HashMap的长度是2的幂次,因为2的幂次减1,二进制一定每一位都为1,保证了与运算可以得到所有数组下标。

HashMap扩容

HashMap扩容时,由于与运算的值只是多了一个高位的1,因此只需要将原下标与原数组长度进行与运算,结果为0则说明不需要改变下标,结果为1则说明新的下标等于原下标+原数组长度。

 

HashMap在并发扩容时可能会形成环链,因此是线程不安全的。

 

LinkedHashMap

1     public LinkedHashMap(int initialCapacity,
2                          float loadFactor,
3                          boolean accessOrder) {
4         super(initialCapacity, loadFactor);
5         this.accessOrder = accessOrder;
6     }

initialCapacity:初始容量

loadFactor:加载因子

accessOrder:true 基于访问顺序,false 基于插入顺序

通过继承LinkedHashMap,定义缓存容量,可以实现LRU。

 

posted @ 2020-09-12 17:10  昆梧  阅读(165)  评论(0)    收藏  举报