HashMap中的下标是通过hash值与(length - 1)进行与运算获得的,例如hash&1111(15)。
位运算的效率比取余效率更高。
HashMap的长度是2的幂次,因为2的幂次减1,二进制一定每一位都为1,保证了与运算可以得到所有数组下标。
HashMap扩容时,由于与运算的值只是多了一个高位的1,因此只需要将原下标与原数组长度进行与运算,结果为0则说明不需要改变下标,结果为1则说明新的下标等于原下标+原数组长度。
HashMap在并发扩容时可能会形成环链,因此是线程不安全的。
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。
原文:https://www.cnblogs.com/kunwu/p/13657673.html