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

浙公网安备 33010602011771号