ArrayList,LinkedList的区别(都是效率高,非线程安全)
hashmap,Hashtabl,LinkedHashMap,ConcurrentHashMap的区别 + 底层实现
-
- 效率高,非同步,线程不安全,最多只一个键为Null;允许值为 Null。
- 底层原理: Hashmap默认容量16,key的哈希值一制则生成链表,链表默认大小8,超过链表默认大小,自动生成红黑树,红黑树通过变色和旋转来保持子父节点平衡。
-
Hashtable(底层哈希表,写入时慢)
- 线程安全,同步,所以效率要慢一点
- 不允许 null 值 (key 和 value 都不可以)
-
LinkedHashMap(底层双向链表,先进先出)
- 保存了记录的插入顺序,在用Iterator遍历时,先得到的记录肯定是先插入的。
-
ConcurrentHashMap(分段锁 - 分段锁其实是一个概念)
- 了解ConcurrentHashMap前,不妨先看看Hashmap的原理。(视频传送门,看完视频就懂了)
- 简单来说ConcurrentHashMap为每一组哈希槽进行分段上锁,不同组的哈希槽进行数据读写操作互不影响
因为ConcurrentHashMap用到了CAS,这里简单说一下CAS
Unsafe类的CAS无锁机制(比较并替换 + 自旋)
- CAS需要三个参数,第一个内存位置,第二个预期旧值,第三个预期新值。
- 如果内存位置的值等于预期旧值,则替换旧值为新值,否则cpu什么都不,简洁点就是:比较并替换
- 如果不成功,会循环重试,也叫做:自旋