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()方法返回集合中的下一個元素。我們應該在調用?next()方法之前調用?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);

? ? }

? }

}

上面的代碼生成以下結果。

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

? }

}

上面的代碼生成以下結果衩藤。

迭代器注意事項

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

要再次遍歷同一集合的元素检诗,請通過調用集合的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)獲取迭代器并調用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)方法。

該方法遍歷所有元素并應用操作牛欢。

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

? ? }));

? }

}

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市氢惋,隨后出現(xiàn)的幾起案子洞翩,更是在濱河造成了極大的恐慌稽犁,老刑警劉巖焰望,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異已亥,居然都是意外死亡熊赖,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門虑椎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來震鹉,“玉大人,你說我怎么就攤上這事捆姜〈海” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵泥技,是天一觀的道長浆兰。 經常有香客問我,道長珊豹,這世上最難降的妖魔是什么簸呈? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮店茶,結果婚禮上蜕便,老公的妹妹穿的比我還像新娘。我一直安慰自己贩幻,他們只是感情好轿腺,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布两嘴。 她就那樣靜靜地躺著,像睡著了一般族壳。 火紅的嫁衣襯著肌膚如雪溶诞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天决侈,我揣著相機與錄音螺垢,去河邊找鬼。 笑死赖歌,一個胖子當著我的面吹牛枉圃,可吹牛的內容都是我干的。 我是一名探鬼主播庐冯,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼孽亲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了展父?” 一聲冷哼從身側響起返劲,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎栖茉,沒想到半個月后篮绿,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡吕漂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年亲配,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惶凝。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡吼虎,死狀恐怖,靈堂內的尸體忽然破棺而出苍鲜,到底是詐尸還是另有隱情思灰,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布混滔,位于F島的核電站洒疚,受9級特大地震影響,放射性物質發(fā)生泄漏遍坟。R本人自食惡果不足惜拳亿,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望愿伴。 院中可真熱鬧肺魁,春花似錦、人聲如沸隔节。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瘾晃,卻和暖如春贷痪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蹦误。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工劫拢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人强胰。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓舱沧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親偶洋。 傳聞我的和親對象是個殘疾皇子熟吏,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內容