迭代、排序与常见陷阱

笔记/Java/Java基础/Java集合/迭代、排序与常见陷阱

上一篇:ConcurrentHashMap · 总览:集合框架总览

核心原理#

Iterator、ListIterator 与 fail-fast#

Collection 继承 Iterable,通过 iterator() 遍历。Iterator 支持 hasNext()next()remove()ListIterator 仅用于 List,可双向遍历、addset

Iterator<String> it = list.iterator();
while (it.hasNext()) {
String s = it.next();
if ("a".equals(s)) {
it.remove(); // 正确
}
}

fail-fast:迭代中集合结构被修改(modCountexpectedModCount)→ ConcurrentModificationException。增强 for 底层也是 Iterator,foreach 里直接 list.remove(obj) 会失败。

fail-safe:如 CopyOnWriteArrayList,迭代快照,读多写少场景。

只读包装:

Collection<String> frozen = Collections.unmodifiableCollection(list);
// frozen.add("y"); // UnsupportedOperationException

遍历 ListArrayListRandomAccess,按下标 for 效率高;LinkedList 更适合 Iterator / foreach。

Comparable 与 Comparator#

ComparableComparator
java.langjava.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#

维度ArrayArrayList
存储基本类型 + 对象仅对象(装箱)
大小固定动态扩容
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 道

List Set Map 区别
List Set Map 区别

  • fail-fast:用 Iterator.remove()removeIf
  • Comparable vs Comparator:内部自然序 vs 外部规则。

一句话总结#

迭代删除走迭代器或 removeIf;排序分清 Comparable/Comparator;数组与 ArrayList 按是否动态增删选型。

文章目录

文章目录