HashMap:
线程不安全,不支持并发操作,键-值(key-value)都允许为空、、不保证有序
在 JDK1.7 中,HashMap 采用头插法插入元素,因此并发情况下会导致环形链表,产生死循环。
虽然 JDK1.8 采用了尾插法解决了这个问题,但是并发下的 put 操作也会使前一个 key 被后一个 key 覆盖。
由于 HashMap 有扩容机制存在,也存在 A 线程进行扩容后,B 线程执行 get 方法出现失误的情况。
默认初始化容量为 16,扩容容量必须是 2 的幂次方、最大容量为 1<< 30 、默认加载因子为 0.75。
HashMap底层是通过链表来解决hash冲突的。
数据结构
JDK1.8之前:数组+链表
JDK1.8之后:数组+链表+红黑树(链表超过 8 会转化为红黑树)
ConcurrentHashMap:
线程安全,支持并发操作,键-值(key-value)不允许为空
源码:
数据结构
JDK1.8之前:数组+数组+链表,
JDK1.8之后:数组+链表+红黑树