Collection 接口集合的遍历方式
# Collection 接口集合的遍历方式
# 1. 增强型 for 循环 (Enhanced for loop)
使用说明:
- 适用集合: 适用于所有实现了
Iterable
接口的集合,如List
、Set
、Queue
等。 - 不适用集合: 不适用于
Map
(因为Map
没有实现Iterable
接口)。 - 使用前提: 集合必须实现
Iterable
接口。 - 注意事项: 只能用于读取操作,无法在遍历中修改集合元素(如增删元素)。
代码示例:
import java.util.Arrays;
import java.util.List;
public class EnhancedForLoopExample {
public static void main(String[] args) {
// 创建一个List集合,存储字符串元素
List<String> stringList = Arrays.asList("Java", "Python", "C++");
// 使用增强型for循环遍历集合
for (String item : stringList) {
// 输出每一个元素
System.out.println(item);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
参数说明:
String item
: 集合中每个元素在遍历时都会赋值给item
,类型需与集合元素类型一致。
# 2. 使用 Iterator 遍历集合
使用说明:
- 适用集合: 适用于所有实现了
Iterable
接口的集合,如List
、Set
、Queue
等。 - 不适用集合: 不适用于
Map
(需要通过entrySet()
、keySet()
或values()
获取集合后再遍历)。 - 使用前提: 集合必须实现
Iterable
接口。 - 注意事项: 可以在遍历中删除元素,避免使用集合的
remove()
方法,而应使用Iterator
提供的remove()
方法以避免ConcurrentModificationException
。
代码示例:
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
public class IteratorExample {
public static void main(String[] args) {
// 创建一个List集合,存储字符串元素
List<String> stringList = Arrays.asList("Java", "Python", "C++");
// 获取集合的迭代器
Iterator<String> iterator = stringList.iterator();
// 使用 while 循环进行遍历
while (iterator.hasNext()) {
// 获取当前元素
String item = iterator.next();
// 输出元素
System.out.println(item);
// 示例:可以在遍历过程中删除元素(此操作不会抛出ConcurrentModificationException)
// iterator.remove();
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
参数说明:
iterator.hasNext()
:判断集合中是否还有未遍历的元素,返回boolean
类型。iterator.next()
:返回下一个元素,并将迭代指针向前移动。iterator.remove()
:删除当前迭代的元素。
# 3. 使用 ListIterator 遍历 List(双向遍历)
使用说明:
- 适用集合: 仅适用于
List
集合,如ArrayList
、LinkedList
。 - 不适用集合: 不适用于
Set
、Queue
、Map
。 - 使用前提: 必须是实现了
List
接口的集合。 - 注意事项:
ListIterator
支持双向遍历和在遍历中修改元素,适用于需要在遍历过程中进行动态修改的场景。
代码示例:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.ListIterator;
public class ListIteratorExample {
public static void main(String[] args) {
// 创建一个ArrayList集合,存储字符串元素
List<String> stringList = new ArrayList<>(Arrays.asList("Java", "Python", "C++"));
// 获取ListIterator对象
ListIterator<String> listIterator = stringList.listIterator();
// 从前向后遍历
System.out.println("从前向后遍历:");
while (listIterator.hasNext()) {
// 获取当前元素
String item = listIterator.next();
System.out.println(item);
// 修改元素:如果元素是 "Java",将其修改为 "Java SE"
if (item.equals("Java")) {
listIterator.set("Java SE");
}
}
// 从后向前遍历
System.out.println("从后向前遍历:");
while (listIterator.hasPrevious()) {
// 获取当前元素
String item = listIterator.previous();
System.out.println(item);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
参数说明:
listIterator.hasNext()
:判断是否有下一个元素。listIterator.hasPrevious()
:判断是否有上一个元素。listIterator.next()
:返回下一个元素并将指针向前移动。listIterator.previous()
:返回上一个元素并将指针向后移动。listIterator.set(E e)
:修改当前元素,E
为新元素。
# 4. 使用 forEach 和 Lambda 表达式
使用说明:
- 适用集合: 适用于所有实现了
Iterable
接口的集合,如List
、Set
、Queue
,以及通过entrySet()
、keySet()
、values()
获取的Map
集合。 - 不适用集合: 没有不适用的集合,只要实现了
Iterable
。 - 使用前提: 集合必须实现
Iterable
接口,并且支持 Lambda 表达式的使用(Java 8 及以上版本)。 - 注意事项: 不适合在遍历过程中进行集合的修改(如增删元素),适用于只读操作。
代码示例:
import java.util.Arrays;
import java.util.List;
public class ForEachLambdaExample {
public static void main(String[] args) {
// 创建一个List集合,存储字符串元素
List<String> stringList = Arrays.asList("Java", "Python", "C++");
// 使用forEach方法和Lambda表达式遍历集合
stringList.forEach(item -> {
// 输出每一个元素
System.out.println(item);
});
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
参数说明:
forEach(Consumer<? super T> action)
:action
是一个Consumer
函数式接口,用于处理每个元素。item
: 每次遍历时当前处理的元素。
# 5. 使用 Stream API 遍历集合
使用说明:
- 适用集合: 适用于所有实现了
Collection
接口的集合,如List
、Set
、Queue
,以及通过entrySet()
、keySet()
、values()
获取的Map
集合。 - 不适用集合: 没有不适用的集合,只要实现了
Collection
。 - 使用前提: 集合必须实现
Collection
接口,并且支持 Lambda 表达式(Java 8 及以上版本)。 - 注意事项:
Stream
适用于大规模数据处理,支持并行流(parallelStream()
),性能优越。
代码示例:
import java.util.Arrays;
import java.util.List;
public class StreamApiExample {
public static void main(String[] args) {
// 创建一个List集合,存储字符串元素
List<String> stringList = Arrays.asList("Java", "Python", "C++");
// 使用Stream API遍历集合
stringList.stream().forEach(item -> {
// 输出每一个元素
System.out.println(item);
});
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
参数说明:
stream()
:返回集合的顺序流。forEach(Consumer<? super T> action)
:对Stream
中的每个元素执行操作。
# 6. 使用传统 for 循环(适用于 List)
使用说明:
- 适用集合: 适用于
List
集合,如ArrayList
、LinkedList
,尤其适合需要基于索引操作的场景。 - 不适用集合: 不适用于
Set
、Queue
、Map
,这些集合不支持通过索引访问。 - 使用前提: 集合必须实现
List
接口,且需要通过索引访问元素。 - 注意事项: 传统
for
循环适合需要对集合进行索引操作或复杂逻辑处理的场景。
代码示例:
import java.util.Arrays;
import java.util.List;
public class TraditionalForLoopExample {
public static void main(String[] args) {
// 创建一个List集合,存储字符串元素
List<String> stringList = Arrays.asList("Java", "Python", "C++");
// 使用传统的for循环遍历集合
for (int i = 0; i < stringList.size(); i++) {
// 通过索引获取当前元素
String item = stringList.get(i);
System.out.println(item);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
参数说明:
int i
:循环变量,用于访问集合中的索引。stringList.get(i)
:根据索引获取集合中的元素。
# 7. Collection 接口集合的遍历总结
- 增强型
for
循环和Iterator
是最常用的遍历方式,适用于大部分集合类型。 ListIterator
仅适用于List
集合,且支持双向遍历和修改操作。forEach
和Stream
提供了更简洁的语法,适用于现代化代码风格,尤其适合只读操作。- 传统
for
循环适合需要精确控制遍历过程和索引操作的场景。
编辑此页 (opens new window)
上次更新: 2025/01/01, 12:41:26