1. Java 集合的快速失败(fail-fast)和安全失败(fail-safe)的差别是什么?
快速失败和安全失败都是 java 集合(Collection)的一种错误机制。单线程情况下,遍历集合时去执行增删等改变集合结构的操作;或者多线程情况下,一个线程遍历集合,另一个线程执行增删等改变集合结构的操作。
-
快速失败,是指失败 / 异常时立即报错,通常会抛出 ConcurrentModificationException 异常,像 java.util 包下面的集合类就是使用这种机制;
-
安全失败,是指失败 / 异常时直接忽略,java.util.concurrent 包下面的集合类都是使用这种机制。
2. HashMap 和 ConcurrentHashMap 的区别?
基础特性不同
HashMap 的 key 和 value 可以为 null,ConcurrentHashMap 的 key 和 value 不能为 null。
内部数据结构不同
HashMap 在 JDK1.7 中采用的数据结构是数组 + 链表,在 JDK1.8 中采用的数据结构是数组 + 链表 / 红黑二叉树;
ConcurrentHashMap 在 JDK1.7 中采用的数据结构是分段的数组 + 链表,JDK1.8 的内部数据结构采用的数据结构是数组 + 链表 / 红黑二叉树(同 HashMap 一致)。
线程安全不同
HashMap 是非线程安全的
ConcurrentHashMap 是线程安全的