Java集合遍歷,你知道嗎

使用迭代器

使用for-each循環(huán)

使用forEach()方法


使用迭代器

集合提供了一個迭代器來遍歷其所有元素。

迭代器可以對集合執(zhí)行以下三個操作:

檢查是否有尚未訪問的元素。

訪問集合中的下一個元素。

刪除集合的最后訪問元素。

Java中的迭代器是?Iterator< E>?接口的一個實例。

我們可以使用Collection接口中的iterator()方法獲取集合的迭代器。

以下代碼創(chuàng)建一個字符串列表,并獲取列表的迭代器:

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()方法返回集合中的下一個元素。我們應(yīng)該在調(diào)用?next()方法之前調(diào)用?hasNext()方法。如果沒有,?next()方法會拋出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()方法。

如果對于每個?next()方法或在第一次調(diào)用next()之前被多次調(diào)用?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);

? }

}

上面的代碼生成以下結(jié)果。

例3

forEachRemaining()方法對集合中尚未由迭代器訪問的每個元素執(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é)果。

迭代器注意事項

迭代器是一次性對象。我們不能重置迭代器,它不能被重用。

要再次遍歷同一集合的元素,請通過調(diào)用集合的iterator()方法來創(chuàng)建一個新的Iterator。

使用for-each循環(huán)

我們可以使用for-each循環(huán)遍歷集合的元素。

我們可以使用for-each循環(huán)遍歷任何實現(xiàn)類實現(xiàn)Iterable接口的集合。

for-each循環(huán)的一般語法如下:

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);

? ? }

? }

}

for-each注意事項

for-each循環(huán)有幾個限制。

我們不能使用for-each循環(huán)從集合中刪除元素。

以下代碼將拋出ConcurrentModificationException異常:

List<String> names = get? a? list;

for(String name : names)? {

? ? names.remove(name);// Throws a? ConcurrentModificationException

}

對于for-each循環(huán),我們沒有辦法從集合的中間開始。

for-each循環(huán)不提供訪問先前訪問的元素的方式。

使用forEach()方法

Iterable接口包含一個新的?forEach(Consumer action)方法。

該方法遍歷所有元素并應(yīng)用操作。

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);

? ? }));

? }

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容