来自一个萌新的博客,记录他的成长!如有不对请指正,谢谢!
HashMap
HashMap是一个keyvalue结构,也是一个链表结构,线程不安全,每一个键值对又叫Entye,插入时不是胡乱插入,而是通过hash算法算出来插入在哪个位置的,(通过hashCode值做&运算,算出来的),但也会有算冲突的时候,所以采用链表结构,当发现冲突的时候,entry通过next指针向下一个节点插入他算出来的位置,采用头插法!
Hashmap的容量是有限的,它的负载因子为0.75,
当储存的键值对也来越多的时候(当前数组长度>=当前数组长度*0.75),
hsamap会进行resize(扩容),增加数组长度为当前长度的2次幂!
说他说线程不安全是因为它在并发情况下会形成带环链表,并且在下一次get时的位置刚好是在带链表区域就会造成成死锁,但要满足一下因素:
(不完全,太绕没搞明白)
- 多线程并发情况
- HashMap容量饱和进行Resize时
ConcurrentHashMap
上说道HashMap线程不安全,但HashTable是线程安全的,效率确实很低,因为它在进行读或者写的时候回把整个集合加锁,导致同一时间的其他操作出现阻塞!
ConcurrentHashMap的底层由Segment实现,他就相当HashMap,我认为可以这样理解ConcurrentHashMap就是由多个HashMap实现,但在这基础上又加了分段锁!
ConcurrentHashMap里面有2的N次方个Segment。
因此在不同Segment的写入是可以并发执行的。
同一个Segment可以一写一读不会有问题,
但是同一Segment是不能并发写入
由此可见,ConcurrentHashMap当中每个Segment各自持有一把锁。在保证线程安全的同时降低了锁的粒度,让并发操作效率更高。