ConcurrentHashMap是将他分为了多个segment,一个元素进来,先计算哈希值,然后分配给一个segment然后只对这个segment加锁,所以效率要比HashTable高很多。
HashMap是由数组和链表组成的,首先一个数进来,计算一下哈希值,如果是第一个值,那么程序就会先分配一个16大小的数组,然后看一下自己要加入的位置是否有元素,如果没有重复,就新建一个节点来保存,如果有了那么就把原来的节点给覆盖掉,如果数组的这个位置的节点数超过了八个,那么就把链表变成一个红黑树,如果数组的容量不足了,那么就resize扩容一下。
然后把hash(key)返回的哈希值与HashMap的初始容量(也叫初始数组的长度)减一做&(与运算)就可以计算出此键值对应该保存到数组的那个位置上(hash&(n-1))。这里为什么不用key本身的hashcode方法,而又是右移动16位又是异或操作。开发人员这样做的目的是什么呢?我的理解是当数组容量很小的时候,计算元素在数组中的位置(n-1)&hash,只用到了hash值的低位,这样当不同的hash值低位相同,高位不同的时候会产生冲突。实际上的hash值将hashcode低16位与高16位做异或运算,相当于混合了高位和低位,增加了随机性。当然是冲突越少越好,元素的分布越随机越好。
网友评论