上一篇:ConcurrentHashMap · 总览:集合框架总览
核心原理
Iterator、ListIterator 与 fail-fast
Collection 继承 Iterable,通过 iterator() 遍历。Iterator 支持 hasNext()、next()、remove();ListIterator 仅用于 List,可双向遍历、add、set。
Iterator<String> it = list.iterator();while (it.hasNext()) { String s = it.next(); if ("a".equals(s)) { it.remove(); // 正确 }}fail-fast:迭代中集合结构被修改(modCount ≠ expectedModCount)→ ConcurrentModificationException。增强 for 底层也是 Iterator,foreach 里直接 list.remove(obj) 会失败。
fail-safe:如 CopyOnWriteArrayList,迭代快照,读多写少场景。
只读包装:
Collection<String> frozen = Collections.unmodifiableCollection(list);// frozen.add("y"); // UnsupportedOperationException遍历 List:ArrayList 有 RandomAccess,按下标 for 效率高;LinkedList 更适合 Iterator / foreach。
Comparable 与 Comparator
| Comparable | Comparator | |
|---|---|---|
| 包 | java.lang | java.util |
| 方法 | compareTo(T o) | compare(T o1, T o2) |
| 含义 | 自然排序 | 外部比较器 |
TreeSet / TreeMap 需要可比较元素或键。Collections.sort(list) 单参数版要求 Comparable;双参数版可传 Comparator。
Collections.sort(words);Collections.sort(words, (a, b) -> b.compareTo(a));Array 与 ArrayList
| 维度 | Array | ArrayList |
|---|---|---|
| 存储 | 基本类型 + 对象 | 仅对象(装箱) |
| 大小 | 固定 | 动态扩容 |
| API | 少 | 丰富 |
Arrays.asList(array) 返回固定大小列表,不能 add/remove。需要可变列表:new ArrayList<>(Arrays.asList(array))。
最小可运行示例
import java.util.*;
public class CollectionDemo { public static void main(String[] args) { List<String> names = new ArrayList<>(); names.add("Tom");
Set<String> tags = new HashSet<>(); tags.add("java"); tags.add("java");
Map<String, Integer> scores = new HashMap<>(); scores.put("Tom", 90);
Deque<String> deque = new ArrayDeque<>(); deque.addFirst("first");
System.out.println(names); System.out.println(tags.size()); System.out.println(scores.get("Tom")); System.out.println(deque.removeFirst()); }}常见陷阱
遍历集合时直接删除
// 错误for (String s : list) { if (s.equals("x")) list.remove(s);}// 正确list.removeIf(s -> s.equals("x"));误以为 HashSet 保持插入顺序
需要顺序用 LinkedHashSet。
Arrays.asList 不是可变 List
需要 new ArrayList<>(Arrays.asList(array))。
ConcurrentHashMap 不允许 null
与 HashMap 不同。
面试速记
完整 52 道:Java 集合面试题 52 道

- fail-fast:用
Iterator.remove()或removeIf。 - Comparable vs Comparator:内部自然序 vs 外部规则。
一句话总结
迭代删除走迭代器或 removeIf;排序分清 Comparable/Comparator;数组与 ArrayList 按是否动态增删选型。