1. HashMap
HashMap是线程不安全的,性能比较好,也最常用
2. HashTable
HashTable是线程安全的,不允许key、value为null,实现方式是通过get、put方法加synchronized,性能比较差。很少使用
3. ConcurrentHashMap
CurrentHashMap是线程安全的,性能也相对想好
4. HashMap的实现原理
jdk1.8以后,HashMap采用数组+链表+红黑树的方式
HashMap插入一个值的过程:
1. 对key进行hashCode操作拿到hash,然后对数组长度取余,拿到数组下标
2. 然后拿这个key挨个跟这个节点上的值进行比较,如果相同,则覆盖,
3. 如果没有相同,且该节点是红黑树,则将该值插入
4. 如果是链表的话,看看长度是否超过8,超过8的话,转成红黑树
5. 如果元素个数超过阈值(元素个数*0.75),就要resize
5. ConcurrentHashMap的实现原理
jdk1.8以后,CurrentHashMap采用数组+链表+红黑树的方式,参考了1.8的HashMap的实现,其中,采用了大量的CAS操作,采用CAS+Synchronized保证线程安全
保证线程安全:
1.7:数组+Segment+分段锁
1.8:synchronized+CAS