Collection集合的遍歷形式
方式一:迭代器
迭代器概述
- 遍歷就是一個(gè)一個(gè)的把容器中的元素訪問(wèn)一遍
- 迭代器在java中的代表是Iterator,迭代器是集合的專(zhuān)用遍歷方式
迭代器獲取及常用方法
Collection集合獲取迭代器
| 方法名稱(chēng) | 說(shuō)明 |
|---|---|
| Iterator<E> iterator() | 返回集合中的迭代器對(duì)象,該迭代器對(duì)象默認(rèn)指向當(dāng)前集合的0索引 |
Iterator中的常用方法
| 方法名稱(chēng) | 說(shuō)明 |
|---|---|
| boolean hasNext() | 詢(xún)問(wèn)當(dāng)前位置是否有元素存在,存在返回true,不存在返回false |
| E next() | 獲取當(dāng)前位置的元素,并同時(shí)將迭代器對(duì)象移向下一個(gè)位置,注意防止取出越界 |
測(cè)試代碼
package com.java.collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/**
* 使用迭代器獲取集合元素
*/
public class CollectionDemo03 {
public static void main(String[] args) {
Collection<String> lists = new ArrayList<>();
lists.add("吳亦凡");
lists.add("華晨宇");
lists.add("陳冠希");
lists.add("張柏芝");
System.out.println(lists);
// 1. 得到當(dāng)前集合的迭代器對(duì)象
Iterator<String> it = lists.iterator();
/* String e = it.next();
System.out.println(e);
System.out.println(it.next());*/
//next()每次成功訪問(wèn)元素后就會(huì)移動(dòng)到下一個(gè)元素的位置,因此要謹(jǐn)防越界問(wèn)題
/* System.out.println(it.next());
System.out.println(it.next());*/
//System.out.println(it.next()); NoSuchElementException,出現(xiàn)無(wú)此元素異常
// 2.定義While循環(huán),使用hasNext()判斷是否有元素,有就進(jìn)入循環(huán)使用next()取出來(lái)
while (it.hasNext()) {
System.out.println(it.next());
// 一個(gè)循環(huán)下不能出現(xiàn)兩個(gè)next語(yǔ)句 否則會(huì)因?yàn)閿?shù)組元素是奇數(shù)是發(fā)生如上異常
}
}
}
-
注意事項(xiàng)
- next()每次成功訪問(wèn)元素后就會(huì)移動(dòng)到下一個(gè)元素的位置,因此要謹(jǐn)防越界問(wèn)題
- 一個(gè)循環(huán)下不能出現(xiàn)兩個(gè)next語(yǔ)句 否則會(huì)因?yàn)閿?shù)組元素是奇數(shù)是發(fā)生如上異常
-
核心代碼
// 1. 得到當(dāng)前集合的迭代器對(duì)象 Iterator<String> it = lists.iterator(); // 2.定義While循環(huán),使用hasNext()判斷是否有元素,有就進(jìn)入循環(huán)使用next()取出來(lái) while (it.hasNext()) { System.out.println(it.next()); // 一個(gè)循環(huán)下不能出現(xiàn)兩個(gè)next語(yǔ)句 否則會(huì)因?yàn)閿?shù)組元素是奇數(shù)是發(fā)生如上異常 }
方式二:foreach/增強(qiáng)for循環(huán)
增強(qiáng)for循環(huán)概述
- 增強(qiáng)for循環(huán):既可以遍歷集合,也可以遍歷數(shù)組
- 它是JDK5之后出現(xiàn)的,其內(nèi)部原理是一個(gè)Iterator迭代器,遍歷集合相當(dāng)于是迭代器的簡(jiǎn)化寫(xiě)法
- 實(shí)現(xiàn)Iterable接口的類(lèi)才可以使用迭代器和增強(qiáng)for,Collection接口已經(jīng)實(shí)現(xiàn)了Iterable接口
格式
for(元素?cái)?shù)據(jù)類(lèi)型 變量名 : 數(shù)組或者Collection集合){
// 在此處使用變量即可,這變量就是元素
}
示例
Collection<String> list = new ArrayList<>();
... ...
for(String ele : list){
System.out.println(ele);
}
測(cè)試代碼
package com.java.collection;
import java.util.ArrayList;
import java.util.Collection;
/**
* 使用增強(qiáng)for循環(huán)(又稱(chēng)foreach)獲取集合元素
*/
public class CollectionDemo04 {
public static void main(String[] args) {
Collection<String> lists = new ArrayList<>();
lists.add("吳亦凡");
lists.add("華晨宇");
lists.add("陳冠希");
lists.add("張柏芝");
System.out.println(lists);
for (String ele : lists) {
System.out.println(ele);
}
// 嘗試遍歷數(shù)組
int[] scores = new int[]{100, 200, 300, 400, 500};
for (int s : scores) {
System.out.println(s);
}
}
}
-
注意隨事項(xiàng)
對(duì)于增強(qiáng)for循環(huán)而言,以上述測(cè)試代碼中數(shù)組測(cè)試為例:int s 和scores是有區(qū)別的,其中s的作用類(lèi)似于result,起到接收的作用,是單獨(dú)定義存在的變量,和數(shù)組的元素?zé)o關(guān),因此,修改s的值不會(huì)影響到數(shù)組中的內(nèi)容
int[] scores = new int[]{100, 200, 300, 400, 500}; for (int s : scores) { System.out.println(s); if (s == 200) { s = 10; // 修改無(wú)意義,不會(huì)影響數(shù)組的元素 } } System.out.println(Arrays.toString(scores));
方式三:Lambda表達(dá)式
-
Collection結(jié)合Lambda遍歷的API
方法名稱(chēng) 說(shuō)明 default void forEach(Consumer<? super T> action): 結(jié)合Lambda遍歷集合 -
測(cè)試代碼
package com.java.collection; import java.util.ArrayList; import java.util.Collection; /** * 結(jié)合Lambda遍歷集合 */ public class CollectionDemo05 { public static void main(String[] args) { Collection<String> lists = new ArrayList<>(); lists.add("吳亦凡"); lists.add("華晨宇"); lists.add("陳冠希"); lists.add("張柏芝"); System.out.println(lists); // forEach源碼 /* default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } } */ /* lists.forEach(new Consumer<String>() { @Override public void accept(String s) { System.out.println(s); } });*/ /* lists.forEach(s -> { System.out.println(s); });*/ lists.forEach(s -> System.out.println(s)); // 現(xiàn)在的新技術(shù):冒號(hào)引用,將上述代碼繼續(xù)簡(jiǎn)化 lists.forEach(System.out::println); } }