Java集合教程 – Java集合遍历
在Java Collections Framework中,不同类型的集合使用不同类型的数据结构以不同的方式存储它们的元素。
一些集合对它们的元素有排序,有些没有。集合框架提供了遍历集合的以下方法:
- 使用迭代器
- 使用for-each循环
- 使用forEach()方法
使用迭代器
集合提供了一个迭代器来遍历其所有元素。
迭代器可以对集合执行以下三个操作:
- 检查是否有尚未访问的元素。
- 访问集合中的下一个元素。
- 删除集合的最后访问元素。
Java中的迭代器是 Iterator< E>
接口的一个实例。
我们可以使用Collection接口中的iterator()方法获取集合的迭代器。
以下代码创建一个字符串列表,并获取列表的迭代器:
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Main { public static void main(String[] args) { // Create a list of strings List<String> names = new ArrayList<>(); // Get an iterator for the list Iterator<String> nameIterator = names.iterator(); } }
迭代器< E> 接口包含以下方法:
boolean hasNext() E next() default void remove() default void forEachRemaining(Consumer<? super E> action)
如果集合中有更多元素要迭代, hasNext()
方法将返回true。否则,它返回false。
next()
方法返回集合中的下一个元素。我们应该在调用 next()
方法之前调用 hasNext()
方法。如果没有, next()
方法会抛出NoSuchElementException异常。
例子
通常, hasNext()
和 next()
方法在循环中一起使用。以下代码使用迭代器打印列表的所有元素:
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Main { public static void main(String[] args) { // Create a list of strings List<String> names = new ArrayList<>(); names.add("A"); names.add("B"); names.add("C"); // Get an iterator for the list Iterator<String> nameIterator = names.iterator(); // Iterate over all elements in the list while (nameIterator.hasNext()) { // Get the next element from the list String name = nameIterator.next(); System.out.println(name); } } }
上面的代码生成以下结果。
remove()
方法删除 next()
方法最后返回的元素。每次调用next()方法只能调用一次 remove()
方法。
如果对于每个 next()
方法或在第一次调用next()之前被多次调用 remove()
方法,它会抛出一个 IllegalStateException
异常。
对 remove()
方法的支持是可选的。remove()
方法可能会抛出一个 UnsupportedOperationException
异常。
例2
以下代码使用迭代器遍历列表的所有元素,并使用remove()方法删除该元素。
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Main { public static void main(String[] args) { // Create a list of strings List<String> names = new ArrayList<>(); names.add("A"); names.add("B"); names.add("C"); Iterator<String> nameIterator = names.iterator(); // Iterate over all elements in the list while (nameIterator.hasNext()) { // Get the next element from the list String name = nameIterator.next(); System.out.println(name); nameIterator.remove(); } System.out.println(names); } }
上面的代码生成以下结果。
例3
forEachRemaining()方法对集合中尚未由迭代器访问的每个元素执行操作。
action指定为 Consumer
。
以下代码显示如何打印列表的所有元素。
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Main { public static void main(String[] args) { // Create a list of strings List<String> names = new ArrayList<>(); names.add("A"); names.add("B"); names.add("C"); Iterator<String> nameIterator = names.iterator(); nameIterator.forEachRemaining(System.out::println); } }
上面的代码生成以下结果。
迭代器注意事项
迭代器是一次性对象。我们不能重置迭代器,它不能被重用。
要再次遍历同一集合的元素,请通过调用集合的iterator()方法来创建一个新的Iterator。
使用for-each循环
我们可以使用for-each循环遍历集合的元素。
我们可以使用for-each循环遍历任何实现类实现Iterable接口的集合。
for-each循环的一般语法如下:
Collection<T> yourCollection = ; for(T element : yourCollection) { }
在幕后,for-each循环获取迭代器并调用hasNext()和next()方法。
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { // Create a list of strings List<String> names = new ArrayList<>(); names.add("A"); names.add("B"); names.add("C"); for (String name : names) { System.out.println(name); } } }
上面的代码生成以下结果。
for-each注意事项
for-each循环有几个限制。
我们不能使用for-each循环从集合中删除元素。
以下代码将抛出ConcurrentModificationException异常:
List<String> names = get a list; for(String name : names) { names.remove(name);// Throws a ConcurrentModificationException }
对于for-each循环,我们没有办法从集合的中间开始。
for-each循环不提供访问先前访问的元素的方式。
使用forEach()方法
Iterable接口包含一个新的 forEach(Consumer action)
方法。
该方法遍历所有元素并应用操作。
forEach()
方法在从 Collection
接口继承的所有集合类型中都可用。
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { // Create a list of strings List<String> names = new ArrayList<>(); names.add("A"); names.add("B"); names.add("C"); names.forEach(System.out::println); } }
上面的代码生成以下结果。