Collection集合的遍歷形式
方式一:迭代器
迭代器概述
- 遍歷就是一個一個的把容器中的元素訪問一遍
- 迭代器在java中的代表是Iterator鄙麦,迭代器是集合的專用遍歷方式
迭代器獲取及常用方法
Collection集合獲取迭代器
方法名稱 | 說明 |
---|---|
Iterator<E> iterator() | 返回集合中的迭代器對象茂翔,該迭代器對象默認指向當前集合的0索引 |
Iterator中的常用方法
方法名稱 | 說明 |
---|---|
boolean hasNext() | 詢問當前位置是否有元素存在驯绎,存在返回true傀蓉,不存在返回false |
E next() | 獲取當前位置的元素秽梅,并同時將迭代器對象移向下一個位置,注意防止取出越界 |
測試代碼
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. 得到當前集合的迭代器對象
Iterator<String> it = lists.iterator();
/* String e = it.next();
System.out.println(e);
System.out.println(it.next());*/
//next()每次成功訪問元素后就會移動到下一個元素的位置,因此要謹防越界問題
/* System.out.println(it.next());
System.out.println(it.next());*/
//System.out.println(it.next()); NoSuchElementException,出現(xiàn)無此元素異常
// 2.定義While循環(huán),使用hasNext()判斷是否有元素感耙,有就進入循環(huán)使用next()取出來
while (it.hasNext()) {
System.out.println(it.next());
// 一個循環(huán)下不能出現(xiàn)兩個next語句 否則會因為數(shù)組元素是奇數(shù)是發(fā)生如上異常
}
}
}
-
注意事項
- next()每次成功訪問元素后就會移動到下一個元素的位置褂乍,因此要謹防越界問題
- 一個循環(huán)下不能出現(xiàn)兩個next語句 否則會因為數(shù)組元素是奇數(shù)是發(fā)生如上異常
-
核心代碼
// 1. 得到當前集合的迭代器對象 Iterator<String> it = lists.iterator(); // 2.定義While循環(huán),使用hasNext()判斷是否有元素持隧,有就進入循環(huán)使用next()取出來 while (it.hasNext()) { System.out.println(it.next()); // 一個循環(huán)下不能出現(xiàn)兩個next語句 否則會因為數(shù)組元素是奇數(shù)是發(fā)生如上異常 }
方式二:foreach/增強for循環(huán)
增強for循環(huán)概述
- 增強for循環(huán):既可以遍歷集合,也可以遍歷數(shù)組
- 它是JDK5之后出現(xiàn)的逃片,其內(nèi)部原理是一個Iterator迭代器屡拨,遍歷集合相當于是迭代器的簡化寫法
- 實現(xiàn)Iterable接口的類才可以使用迭代器和增強for,Collection接口已經(jīng)實現(xiàn)了Iterable接口
格式
for(元素數(shù)據(jù)類型 變量名 : 數(shù)組或者Collection集合){
// 在此處使用變量即可褥实,這變量就是元素
}
示例
Collection<String> list = new ArrayList<>();
... ...
for(String ele : list){
System.out.println(ele);
}
測試代碼
package com.java.collection;
import java.util.ArrayList;
import java.util.Collection;
/**
* 使用增強for循環(huán)(又稱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);
}
}
}
-
注意隨事項
對于增強for循環(huán)而言,以上述測試代碼中數(shù)組測試為例:int s 和scores是有區(qū)別的损离,其中s的作用類似于result哥艇,起到接收的作用,是單獨定義存在的變量僻澎,和數(shù)組的元素無關貌踏,因此,修改s的值不會影響到數(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; // 修改無意義窟勃,不會影響數(shù)組的元素 } } System.out.println(Arrays.toString(scores));
方式三:Lambda表達式
-
Collection結合Lambda遍歷的API
方法名稱 說明 default void forEach(Consumer<? super T> action): 結合Lambda遍歷集合 -
測試代碼
package com.java.collection; import java.util.ArrayList; import java.util.Collection; /** * 結合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)在的新技術:冒號引用祖乳,將上述代碼繼續(xù)簡化 lists.forEach(System.out::println); } }