在Java Collections Framework中,不同類(lèi)型的集合使用不同類(lèi)型的數(shù)據(jù)結(jié)構(gòu)以不同的方式存儲(chǔ)它們的元素。
一些集合對(duì)它們的元素有排序,有些沒(méi)有。集合框架提供了遍歷集合的以下方法:
集合提供了一個(gè)迭代器來(lái)遍歷其所有元素。
迭代器可以對(duì)集合執(zhí)行以下三個(gè)操作:
Java中的迭代器是 Iterator< E>
接口的一個(gè)實(shí)例。
我們可以使用Collection接口中的iterator()方法獲取集合的迭代器。
以下代碼創(chuàng)建一個(gè)字符串列表,并獲取列表的迭代器:
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()
方法返回集合中的下一個(gè)元素。我們應(yīng)該在調(diào)用 next()
方法之前調(diào)用 hasNext()
方法。如果沒(méi)有, next()
方法會(huì)拋出NoSuchElementException異常。
通常, hasNext()
和 next()
方法在循環(huán)中一起使用。以下代碼使用迭代器打印列表的所有元素:
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); } } }
上面的代碼生成以下結(jié)果。
remove()
方法刪除 next()
方法最后返回的元素。每次調(diào)用next()方法只能調(diào)用一次 remove()
方法。
如果對(duì)于每個(gè) next()
方法或在第一次調(diào)用next()之前被多次調(diào)用 remove()
方法,它會(huì)拋出一個(gè) IllegalStateException
異常。
對(duì) remove()
方法的支持是可選的。remove()
方法可能會(huì)拋出一個(gè) UnsupportedOperationException
異常。
以下代碼使用迭代器遍歷列表的所有元素,并使用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); } }
上面的代碼生成以下結(jié)果。
forEachRemaining()方法對(duì)集合中尚未由迭代器訪(fǎng)問(wèn)的每個(gè)元素執(zhí)行操作。
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); } }
上面的代碼生成以下結(jié)果。
迭代器是一次性對(duì)象。我們不能重置迭代器,它不能被重用。
要再次遍歷同一集合的元素,請(qǐng)通過(guò)調(diào)用集合的iterator()方法來(lái)創(chuàng)建一個(gè)新的Iterator。
我們可以使用for-each循環(huán)遍歷集合的元素。
我們可以使用for-each循環(huán)遍歷任何實(shí)現(xiàn)類(lèi)實(shí)現(xiàn)Iterable接口的集合。
for-each循環(huán)的一般語(yǔ)法如下:
Collection<T> yourCollection = ; for(T element : yourCollection) { }
在幕后,for-each循環(huán)獲取迭代器并調(diào)用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); } } }
上面的代碼生成以下結(jié)果。
for-each循環(huán)有幾個(gè)限制。
我們不能使用for-each循環(huán)從集合中刪除元素。
以下代碼將拋出ConcurrentModificationException異常:
List<String> names = get a list; for(String name : names) { names.remove(name);// Throws a ConcurrentModificationException }
對(duì)于for-each循環(huán),我們沒(méi)有辦法從集合的中間開(kāi)始。
for-each循環(huán)不提供訪(fǎng)問(wèn)先前訪(fǎng)問(wèn)的元素的方式。
Iterable接口包含一個(gè)新的 forEach(Consumer action)
方法。
該方法遍歷所有元素并應(yīng)用操作。
forEach()
方法在從 Collection
接口繼承的所有集合類(lèi)型中都可用。
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); } }
上面的代碼生成以下結(jié)果。
更多建議: