首先考虑的问题任然是高并发的安全问题:
HashMap是一个不安全的,多线程会导致数据不一致。
Hashtable是安全的,但是速度比较慢,只要是安全的就是一性能为代价换来的,加锁开锁需要时间,加锁是只能一个线程访问.
ConcurrentHashMap类也是安全的,增加时使用了synchronized保证的安全。
而读取使用了volatileb确保它的可见性,保证的安全,volatile速度比synchronized是快一些的,读取用它住够了。
Map排序问题:
TreeMap可以保证key去重,也可以排序,自己写比较器进行key排序(对象排序)
当然要想进行去重,就得自定义去重(对象去重)。
LinkedHashMap也是将key放在链表上,所以它存入的顺序和取出的顺序是一样的。
HashMap是键值对结构,通过key查找value,key的值会进行hashCode得到一个hash值,,再根据hashMap的数组大小取余。这样就保证了key可以在初始数组中。
当然在数据变多的时候,数组也会发生该表:
hashMap数组的默认大小是16格,当数据数量达到75%时(arr.leng()*0.75)就会触发扩容,将数组翻倍,变成32个,任然75%时继续扩容。
所以麻烦就来了,在有限的范围里放75%的东西,极有可能放在同一个位置,产生了哈希冲突。所以HashMap就是用了拉链存储发,如图(样例,这几个字母真实的存储并不是这样):
而链表的遍历又有一个致命的缺点,那就是慢o(n)的时间复杂度。所以在一定情况下,会转换为红黑树(特殊的二叉树搜索树,最小、最大高度绝对值<=1)。
在链表长度大于8且数组大小大于等于64时,将会吧链表转换为红黑树。
而在红黑树中只要高度小于6时,将会转回链表。