一、Map
-
HashMap
- 在jdk1.7与1.8中的区别?
jdk1.7: 数组+链表 jdk1.8: 数组+链表/红黑树
-
- 线程不安全的原因?
jdk1.7: 环形链表(扩容时的transfer方法:头插法 -> 死循环); 数据丢失; jdk1.8: 数据覆盖;
-
- 数组每次扩容2倍(保持数组容量为2^n)的原因?
减少hash碰撞:(n - 1)& hash
-
ConcurrentHashMap
- 在jdk1.7与1.8中的区别?
jdk1.7: 实现:数组 + Segment 安全:分段锁(最多16个Segment) 注:Segment继承ReentrantLock,类似HashMap jdk1.8: 实现:数组 + 链表 / 红黑树 安全:synchronized + cas,对每个数组元素(即链表 / 红黑树)加锁 优势:获得jvm支持;减少内存开销(获得锁、加锁、释放锁)
二、List
-
ArrayList与LinkedList区别?
ArrayList | LinkedList | |
数据结构 | 数组 | 链表 |
效率 | 适合查询 | 适合增、删 |
内存 | 小 | 大 |
三、并发下的问题
说明 | |
ArrayList、HashMap |
效率高、线程不安全; 可通过Collections.synchronizedList(list);Collections.synchronizedMap(map);保证线程安全 |
Vector、Hashtable |
效率低、线程安全; 本质上是通过synchronized保证线程安全的; |
CopyOnWriteArrayList、ConcurrentHashMap |
效率高、线程安全; |