LinkedHashSet迭代器特性
- 顺序性:LinkedHashSet的迭代器会按照元素插入的顺序进行迭代。这是因为LinkedHashSet内部不仅使用哈希表来存储元素以保证元素的唯一性,还通过链表维护了元素插入的顺序。例如:
LinkedHashSet<String> set = new LinkedHashSet<>();
set.add("apple");
set.add("banana");
set.add("cherry");
for (String s : set) {
System.out.println(s);
}
// 输出顺序为 apple, banana, cherry
- 快速失败:和大多数Java集合类的迭代器一样,LinkedHashSet的迭代器是快速失败的。如果在迭代过程中集合的结构被修改(除了通过迭代器自身的remove方法),迭代器会抛出
ConcurrentModificationException
。例如:
LinkedHashSet<String> set = new LinkedHashSet<>();
set.add("apple");
Iterator<String> it = set.iterator();
set.add("banana"); // 集合结构被修改
it.next(); // 抛出ConcurrentModificationException
优势场景
- 需要保持插入顺序的场景:比如记录用户操作日志,按照操作发生的先后顺序存储并展示,LinkedHashSet能确保操作记录按顺序迭代,方便查看和分析。
- 缓存场景:在实现简单缓存时,可能需要按照元素进入缓存的顺序来管理元素。当缓存满时,按照插入顺序移除最早进入的元素(FIFO策略),LinkedHashSet可以很方便地实现这一逻辑,因为其迭代器按插入顺序遍历,可轻松定位最早插入的元素。