在程序开发中,经常需要遍历集合中的所有元素。针对这种需求,JDK专门提供了一个接口java.util.Iterator
。Iterator
接口也是Java集合中的一员,但它与Collection
、Map
接口有所不同,Collection
接口与Map
接口主要用于存储元素,而Iterator
主要用于迭代访问(即遍历)Collection
中的元素,因此Iterator
对象也被称为迭代器。
想要遍历Collection集合,那么就需要获取该集合迭代器完成迭代操作,下面介绍一下获取迭代器的方法:
public Iterator iterator()
:获取集合对应的迭代器,用来遍历集合中的元素的。下面介绍一下迭代的概念:
迭代即Collection集合元素的通用获取方式。在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续再判断,如果还有就再取出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代。
Iterator接口的常用方法如下:
public E next()
:返回迭代的下一个元素。public boolean hasNext()
:如果仍有元素可以迭代,则返回true。接下来我们通过案例学习如何使用Iterator迭代集合中元素:
public class IteratorDemo {
public static void main(String[] args) {
// 使用多态方式 创建对象
Collection<String> coll = new ArrayList<String>();
// 添加元素到集合
coll.add("串串星人");
coll.add("吐槽星人");
coll.add("汪星人");
//遍历
//使用迭代器 遍历 每个集合对象都有自己的迭代器
Iterator<String> it = coll.iterator();
// 泛型指的是 迭代出 元素的数据类型
while(it.hasNext()){ //判断是否有迭代元素
String s = it.next();//获取迭代出的元素
System.out.println(s);
}
}
}
tips:在进行集合元素取出时,如果集合中已经没有元素了,还继续使用迭代器的next方法,将会发生java.util.NoSuchElementException没有集合元素异常。
我们在之前的案例已经完成了Iterator遍历集合的整个过程。当遍历集合时,首先通过调用集合的iterator()方法获得迭代器对象,然后使用hasNext()方法判断集合中是否存在下一个元素,如果存在,则调用next()方法将元素取出,否则说明已经到达了集合末尾,停止遍历元素。
Iterator迭代器在遍历集合时,内部采用指针的方式来跟踪集合中的元素,下面我们通过一个图解来掩饰Iterator对象迭代元素的过程:
在调用Iterator的next方法之前,迭代器的索引位于第一个元素之前,不指向任何元素,当第一次调用迭代器的next方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回,当再次调用next方法时,迭代器的索引会指向第二个元素并将该元素返回,以此类推,直到hasNext方法返回false,表示到达了集合的末尾,终止对元素的遍历。
增强for循环(也称for each循环)是JDK 1.5以后出来的一个高级for循环,专门用来遍历数组和集合的。它的内部原理其实是个Iterator迭代器,所以在遍历过程中,不能对集合中的元素进行增删操作。
格式:
for(元素的数据类型 变量 : Collection集合or数组){
//写操作代码
}
它用于遍历Collection和数组。通常只进行遍历元素,不要在遍历的过程中对集合元素进行增删操作。
public class NBForDemo1 {
public static void main(String[] args) {
int[] arr = {3,5,6,87};
//使用增强for遍历数组
for(int a : arr){//a代表数组中的每个元素
System.out.println(a);
}
}
}
public class NBFor {
public static void main(String[] args) {
Collection<String> coll = new ArrayList<String>();
coll.add("小河神");
coll.add("老河神");
coll.add("神婆");
//使用增强for遍历
for(String s :coll){//接收变量s代表 代表被遍历到的集合元素
System.out.println(s);
}
}
}
tips:新for循环必须有被遍历的目标。目标只能是Collection或数组。新式for仅仅作为遍历操作出现。
package com.zzm.day13.demo02;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/**
* 用途:
* 时间:2021/6/30 18:14
* 创建人:张子默
*/
/*
java.util.Iterator:迭代器(对集合进行遍历)
有两个常用的方法
boolean hasNext():如果仍有元素可以迭代,则返回 true。
判断集合中还有没有下一个元素,有就返回true,没有就返回false
E next():返回迭代的下一个元素。
取出集合中的下一个元素
Iterator迭代器是一个接口,我们无法直接使用,需要使用Iterator接口的实现类对象,获取实现类的方式比较特殊
Collection接口中有一个方法,叫iterator(),这个方法返回的就是迭代器的实现类对象
Iterator<E> iterator():返回在此 collection 的元素上进行迭代的迭代器。
迭代器的使用步骤(重点):
1.使用集合中的方法iterator()获取迭代类的实现类对象,使用Iterator接口接收(多态)
2.使用Iterator接口中的方法hasNext判断还有没有下一个元素
3.使用Iterator接口中的方法next取出集合中的下一个元素
*/
public class Demo01Iterator {
public static void main(String[] args) {
// 创建一个集合对象
Collection<String> coll = new ArrayList<>();
// 往集合中添加元素
coll.add("姚明");
coll.add("科比");
coll.add("麦迪");
coll.add("詹姆斯");
coll.add("艾弗森");
/*
1.使用集合中的方法iterator()获取迭代器的实现类对象,使用Iterator接口接收(多态)
注意:
Iterator<E>接口也是有泛型的,迭代器的泛型跟着集合走,集合是什么泛型,迭代器就是什么泛型
*/
// 多态 接口 实现类对象
Iterator<String> it = coll.iterator();
/*
发现使用迭代器取出集合中元素的代码是一个重复的过程
所以我们可以使用循环优化
不知道集合中有多少元素,使用while循环
循环结束的条件,hasNext方法返回false
*/
while (it.hasNext()) {
String e = it.next();
System.out.println(e);
}
System.out.println("==============");
for (Iterator<String> it2 = coll.iterator(); it2.hasNext(); ) {
String e = it2.next();
System.out.println(e);
}
/*// 2.使用Iterator接口中的方法hasNext判断还有没有下一个元素
boolean b = it.hasNext();
System.out.println(b); // true
// 3.使用Iterator接口中的方法next取出集合中的下一个元素
String s = it.next();
System.out.println(s); // 姚明
b = it.hasNext();
System.out.println(b); // true
s = it.next();
System.out.println(s); // 科比
b = it.hasNext();
System.out.println(b); // true
s = it.next();
System.out.println(s); // 麦迪
b = it.hasNext();
System.out.println(b); // true
s = it.next();
System.out.println(s); // 詹姆斯
b = it.hasNext();
System.out.println(b); // true
s = it.next();
System.out.println(s); // 艾弗森
b = it.hasNext();
System.out.println(b); // 没有元素,返回false
s = it.next(); // 没有元素,在取出元素时会抛出NoSuchElementException没有元素异常
System.out.println(s); //*/
}
}
package com.zzm.day13.demo02;
import java.util.ArrayList;
/**
* 用途:
* 时间:2021/6/30 18:59
* 创建人:张子默
*/
/*
增强for循环:底层使用的也是迭代器,使用for循环的格式,简化了迭代器的书写
是JDK 1.5之后出现的新特性
public interface Collection<E>extends Iterable<E>,所有的单列集合都可以使用增强for
public interface Iterable<T>实现这个接口允许对象成为 "foreach" 语句的目标。
增强for循环:用来遍历集合和数组
格式:
for (集合/数组的数据类型 变量名 : 集合名/数组名) {
sout(变量名);
}
*/
public class Demo02Foreach {
public static void main(String[] args) {
demo01();
demo02();
}
/*
使用增强for循环遍历集合
*/
private static void demo02() {
ArrayList<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
for (String s : list) {
System.out.println(s);
}
}
// 使用增强for循环遍历数组
private static void demo01() {
int[] arr = {1, 2, 3, 4, 5};
for (int i: arr) {
System.out.println(i);
}
}
}