题目要求
创建并存储 Person 对象,通过 ArrayList 集合实现,并使用迭代器遍历。
代码实现
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class MainTest {
public static void main(String[] args) {
List<Person> list = new ArrayList<Person>();
Person p1 = new Person("小张",19);
Person p2 = new Person("小王",20);
Person p3 = new Person("小李",21);
Person p4 = new Person("小红",18);
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
Iterator<Person> iterator = list.iterator();
while(iterator.hasNext()) {
Person person0 = iterator.next();
System.out.println(person0.getName()+" "+person0.getAge());
}
}
}
控制台输出
小张 19
小王 20
小李 21
小红 18
如果我再次调用 next() 方法,并输出里面的信息,会发生什么呢?我们将下面的两行代码添加到原程序的末尾,再运行一次看看结果是什么。
Person person1 = iterator.next();
System.out.println(person1.getName()+" "+person1.getAge());
添加代码后的输出
小张 19
小王 20
小李 21
小红 18
Exception in thread "main" java.util.NoSuchElementException
at java.base/java.util.ArrayList$Itr.next(ArrayList.java:970)
at CSDNCode/nextFunction.MainTest.main(MainTest.java:29)
后面表示访问元素不存在
next() 方法解释
next() 方法的内部原理并非是指针,在java中没有没有指针的说法,这里只是为了理解更加方便, 从而用指针做相关的解释。
通过三步来理解完整过程
1.数据存入
2.迭代器封装
使用迭代器就相当于把集合内的所有元素都封装起来到一个容器里了,并且这个容器不可被修改,只能被读取。
3.next() 遍历
假设容器iterator是一个指针p,在程序开始时,这个指针p应该指向的位置是列表首地址的前一个地址
这里的iterator并不是指整个大的容器iterator,而是指我们在程序中定义的那个变量iterator,可以认为这是大容器中的一个内部指针
iterator (即指针) 通过调用 hasnext() 方法,判断下一个地址是否存在元素
如果下一地址有元素,则 iterator (即指针)通过调用 next() 方法,将该地址的元素值返回给定义的变量,调用 next() 方法后,指针p会自动移向下一元素的地址;当下一地址没有元素(一般以此作为遍历结束的标志),则不能调用 next() 方法,如果强行调用则会抛出异常(NoSuchElementException)
总结
关于 next() 方法的理解主要在于调用 next() 后,容器 iterator (即比喻的那个p指针)发生的变化;每一次调用 next() 方法,都会做两部操作;
一、先把p指针的下一地址的元素返回;
二、再把p指针移动到下一位;
并且这两部操作同时进行!这个操作与C语言中文件读取函数的操作机器相类似!建议参照那个函数可以更好地理解这里的 next() 方法。