-
使用迭代器
-
使用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);
names.forEach((s -> {
System.out.println(s);
}));
}
}