第一部分:Java集合框架概述

Java集合框架提供了一套接口和类,用于存储和处理数据集合

学习目标

理解Java集合框架的层次结构,掌握主要集合类型及其特点

集合框架层次结构

  • Collection接口:所有集合类的根接口
  • List接口:有序集合,允许重复元素(ArrayList, LinkedList)
  • Set接口:无序集合,不允许重复元素(HashSet, TreeSet)
  • Queue接口:队列实现(LinkedList, PriorityQueue)
  • Map接口:键值对集合(HashMap, TreeMap)

为什么需要遍历集合

  • 访问集合中的每个元素
  • 对元素进行处理或转换
  • 过滤符合条件的元素
  • 聚合计算(求和、平均值等)
  • 查找特定元素

List 集合

  • ArrayList
  • LinkedList
  • Vector
  • Stack

Set 集合

  • HashSet
  • LinkedHashSet
  • TreeSet

Map 集合

  • HashMap
  • LinkedHashMap
  • TreeMap
  • Hashtable

Queue 集合

  • LinkedList
  • PriorityQueue
  • ArrayDeque

第二部分:集合遍历方法

Java提供了多种集合遍历方式,各有适用场景

学习目标

掌握各种集合遍历方法,理解其优缺点及适用场景

1

for循环遍历(List)

适用于List等有索引的集合

List<String> fruits = new ArrayList<>(); fruits.add("Apple"); fruits.add("Banana"); fruits.add("Orange"); for (int i = 0; i < fruits.size(); i++) { String fruit = fruits.get(i); System.out.println(fruit); }

注意:此方法不适用于Set等无索引的集合

2

增强for循环

适用于所有实现Iterable接口的集合

Set<Integer> numbers = new HashSet<>(); numbers.add(10); numbers.add(20); numbers.add(30); for (Integer num : numbers) { System.out.println(num); }

注意:遍历过程中不能修改集合结构

3

迭代器遍历

最通用的集合遍历方式

List<String> colors = new ArrayList<>(); colors.add("Red"); colors.add("Green"); colors.add("Blue"); Iterator<String> iterator = colors.iterator(); while (iterator.hasNext()) { String color = iterator.next(); System.out.println(color); // 可以在遍历中安全删除元素 if (color.equals("Green")) { iterator.remove(); } }

使用迭代器可以在遍历过程中安全地删除元素

4

forEach方法(Java 8+)

使用Lambda表达式简化遍历

Map<String, Integer> ages = new HashMap<>(); ages.put("Alice", 30); ages.put("Bob", 25); ages.put("Charlie", 35); // 遍历Map的entrySet ages.entrySet().forEach(entry -> { System.out.println(entry.getKey() + ": " + entry.getValue()); }); // 遍历List List<String> names = Arrays.asList("John", "Jane", "Doe"); names.forEach(name -> System.out.println(name));

使用::方法引用更简洁:names.forEach(System.out::println)

第三部分:迭代器详解

深入理解迭代器的工作原理和使用方法

学习目标

掌握Iterator接口的核心方法,理解迭代器的工作机制

hasNext()

检查集合中是否还有更多元素

while (iterator.hasNext()) { // 执行操作 }

next()

返回下一个元素并移动迭代器位置

String element = iterator.next();

remove()

删除上次调用next()返回的元素

iterator.next(); // 先获取元素 iterator.remove(); // 再删除

forEachRemaining() (Java 8+)

对剩余元素执行操作

iterator.forEachRemaining(System.out::println);

1. 创建迭代器

通过集合的iterator()方法获取

2. 检查元素

使用hasNext()检查是否还有元素

3. 获取元素

使用next()获取当前元素并前进

4. 可选操作

对元素进行操作,或使用remove()删除

5. 重复步骤2-4

直到hasNext()返回false

第四部分:Map集合遍历

Map集合的多种遍历方式及其适用场景

学习目标

掌握Map集合的键、值、键值对的遍历方法

1

遍历键集合(KeySet)

Map<String, Integer> scores = new HashMap<>(); scores.put("Math", 90); scores.put("English", 85); scores.put("Science", 92); for (String subject : scores.keySet()) { System.out.println(subject); }

只获取键,不直接获取值

2

遍历值集合(Values)

for (Integer score : scores.values()) { System.out.println(score); }

只获取值,不获取对应的键

3

遍历键值对(EntrySet)

// 使用增强for循环 for (Map.Entry<String, Integer> entry : scores.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue()); } // 使用迭代器 Iterator<Map.Entry<String, Integer>> it = scores.entrySet().iterator(); while (it.hasNext()) { Map.Entry<String, Integer> entry = it.next(); System.out.println(entry.getKey() + ": " + entry.getValue()); }

推荐方式:同时获取键和值,效率较高

4

Java 8+的forEach方法

// 使用Lambda表达式 scores.forEach((subject, score) -> System.out.println(subject + ": " + score) ); // 使用方法引用 scores.entrySet().forEach(System.out::println);

最简洁的方式,适合现代Java开发

第五部分:常见错误与最佳实践

避免常见陷阱,掌握集合遍历的最佳实践

学习目标

识别并解决集合遍历中的常见问题,掌握高效安全的使用方法

常见错误1:并发修改异常

ConcurrentModificationException

在使用增强for循环时修改集合结构

List<String> list = new ArrayList<>(); list.add("A"); list.add("B"); for (String s : list) { if (s.equals("B")) { list.remove(s); // 抛出异常 } }

解决方案:使用迭代器的remove()方法

常见错误2:迭代器使用不当

NoSuchElementException

在调用next()前未检查hasNext()

Iterator<String> it = list.iterator(); String first = it.next(); // 如果集合为空则抛出异常

解决方案:始终在调用next()前检查hasNext()

遍历方式选择

  • 需要索引时:使用for循环(仅List)
  • 需要删除元素:使用迭代器
  • 简单遍历:增强for循环
  • Java 8+:优先使用forEach

性能优化

  • ArrayList:for循环最快
  • LinkedList:使用迭代器或增强for循环
  • HashMap:优先使用entrySet
  • 大集合:避免多次调用size()

线程安全

  • 多线程环境使用同步集合
  • 或使用Collections.synchronizedXXX
  • 或使用ConcurrentHashMap等并发集合
  • 使用迭代器时需要外部同步
遍历方式 适用集合 可删除元素 性能 线程安全要求
for循环 List及其子类 是(使用索引删除) 高(ArrayList)
低(LinkedList)
需要外部同步
增强for循环 所有Iterable 需要外部同步
迭代器 所有Collection 是(使用remove()) 需要外部同步
forEach (Java 8+) 所有Iterable 中高 需要外部同步

第六部分:总结与练习

巩固学习成果,通过练习掌握集合遍历技巧

学习目标

总结集合遍历要点,通过实践加深理解

关键知识点总结

  • 集合遍历是访问集合元素的基本操作
  • Java提供了多种遍历方式:for循环、增强for、迭代器、forEach
  • 迭代器是唯一允许在遍历中安全删除元素的方式
  • Map集合最有效的遍历方式是通过entrySet
  • 避免在遍历过程中修改集合结构(除迭代器remove外)
  • Java 8的forEach方法结合Lambda让代码更简洁

动手练习

  1. 创建一个String类型的ArrayList,使用四种不同方式遍历并打印元素
  2. 创建一个HashMap,存储商品名称和价格,遍历并打印所有超过100元的商品
  3. 创建一个Integer类型的HashSet,使用迭代器删除所有偶数
  4. 比较ArrayList和LinkedList在不同遍历方式下的性能差异
  5. 编写一个方法,接收任意Collection,返回元素数量统计
?

理解检查

在遍历ArrayList时,哪种方式性能最好?