36.集合:Collection集合的遍历形式
2022-03-08 本文已影响0人
每天起床都想摆
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,出现无此元素异常
// 2.定义While循环,使用hasNext()判断是否有元素,有就进入循环使用next()取出来
while (it.hasNext()) {
System.out.println(it.next());
// 一个循环下不能出现两个next语句 否则会因为数组元素是奇数是发生如上异常
}
}
}
-
注意事项
- next()每次成功访问元素后就会移动到下一个元素的位置,因此要谨防越界问题
- 一个循环下不能出现两个next语句 否则会因为数组元素是奇数是发生如上异常
-
核心代码
// 1. 得到当前集合的迭代器对象 Iterator<String> it = lists.iterator(); // 2.定义While循环,使用hasNext()判断是否有元素,有就进入循环使用next()取出来 while (it.hasNext()) { System.out.println(it.next()); // 一个循环下不能出现两个next语句 否则会因为数组元素是奇数是发生如上异常 }
方式二:foreach/增强for循环
增强for循环概述
- 增强for循环:既可以遍历集合,也可以遍历数组
- 它是JDK5之后出现的,其内部原理是一个Iterator迭代器,遍历集合相当于是迭代器的简化写法
- 实现Iterable接口的类才可以使用迭代器和增强for,Collection接口已经实现了Iterable接口
格式
for(元素数据类型 变量名 : 数组或者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循环(又称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);
}
// 尝试遍历数组
int[] scores = new int[]{100, 200, 300, 400, 500};
for (int s : scores) {
System.out.println(s);
}
}
}
-
注意随事项
-
对于增强for循环而言,以上述测试代码中数组测试为例:int s 和scores是有区别的,其中s的作用类似于result,起到接收的作用,是单独定义存在的变量,和数组的元素无关,因此,修改s的值不会影响到数组中的内容
int[] scores = new int[]{100, 200, 300, 400, 500}; for (int s : scores) { System.out.println(s); if (s == 200) { s = 10; // 修改无意义,不会影响数组的元素 } } 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)); // 现在的新技术:冒号引用,将上述代码继续简化 lists.forEach(System.out::println); } }