HashMap
底层数据结构为:数组+链表
链表长度>7的时候,采用红黑树
支持查找、插入等操作,时间复杂度为O(log(n))
hashmap初始容量为16 当put的时候,才真正地初始化数组,分配了内存(16)。
为什么hashmap的大小为2的N次幂
首先我们要明白hashmap的hash计算是如何进行的。 我们拿到一个key值,假设他的hash值为87992,那么在hashmap进行定位处理的时候,为了使其更散列化,会进行一系列的异或运算,最终再与16进行一个与运算, 获得的值必定在0000-1111之间,不会数组越界。同时与1111进行与运算也保证了运算前数据的散列性。
ConcurrentHashMap
相比于hashmap,ConcurrentHashMap进行了一个对数组加锁操作。当hashmap的大小为16时,其16个数组每个数组都会有一个segment,每个线程来访只能访问一个segment,因此最多可以有16个线程同时操作ConcurrentHashMap而同时保证线程是安全的。