什么是Iterator(迭代器)
一个用来遍历集合的对象。
Iterator的好处
屏蔽了众多集合的内部实现,对外提供统一的访问方式。
所有的单列集合都可以使用迭代器遍历
迭代器的执行过程
Iterator<E> iterator();通过集合的方法获得迭代器对象: boolean hasNext() 判断当前指针指向位置是否有元素,如果有返回true,否则返回false E next() 返回当前指针指向位置元素,并将指针下移指向下一个元素。
// 1. 创建集合对象 ArrayList<String> list = new ArrayList<>(); // 2. 往集合中存放元素 list.add("abc1"); list.add("abc2"); list.add("abc3"); // 3. 获取容器的迭代器 Iterator<String> iter = list.iterator(); // 4. 使用迭代器判断当前指针指向位置是否有元素 while (iter.hasNext()) { // 5. 使用迭代器对象获取当前指针指向位置元素,并将指针下移指向下一个元素。 String s = iter.next(); System.out.println(s); }
迭代自定义对象
并发修改异常解决办法
并发修改异常产生的原因
在使用迭代器遍历集合时,调用了集合对象的方法(add,clear)往集合中添加元素或删除元素。
Java语法规定:在使用迭代器迭代集合的过程中不允许调用集合的方法增删元素。
如何解决并发修改的问题
方式1:使用普通for循环遍历
方式2:使用ListIterator迭代器代替Iterator,添加或删除元素调用迭代器的相关方法,
不能调用集合对象的方法
// 创建集合对象 ArrayList<Student> list = new ArrayList<>(); list.add(new Student("jack")); list.add(new Student("rose")); list.add(new Student("laowang")); // 使用普通for循环 for(int index = 0;index < list.size();index ++) { // 获得学生对象 Student stu = list.get(index); // 判断姓名是否是rose,如果是则添加lily到集合中 if(stu.getName().equals("rose")) { // 创建lily添加到集合中 list.add(new Student("xixi")); } System.out.println(stu); } System.out.println("-----------------------------"); // 获得迭代器对象 Iterator<Student> it = list.iterator(); while(it.hasNext()) { // 获得学生对象 Student stu = it.next(); // 判断姓名是否是rose,如果是则添加lily到集合中 if(stu.getName().equals("rose")) { // 创建lily添加到集合中 //list.add(new Student("lily")); stu.setName("xiaoxiao"); } System.out.println(stu); } System.out.println("-----------------------------"); // 使用ListIterator来遍历集合 ListIterator<Student> itl = list.listIterator(); while(itl.hasNext()) { // 获得学生对象 Student stu = itl.next(); // 判断姓名是否是rose,如果是则添加lily到集合中 if(stu.getName().equals("jack")) { itl.remove(); // 创建lily添加到集合中 itl.add(new Student("lily")); } System.out.println(stu); } System.out.println(list);
学生类:
public class Student { private String name; public Student(String name) { super(); this.name = name; } public Student() { super(); // TODO Auto-generated constructor stub } public String getName() { return name; } public void setName(String name) { this.name = name; } public String toString() { return "Student [name=" + name + "]"; } }
列表迭代器:
ListIterator listIterator():List集合特有的迭代器
该迭代器继承了Iterator迭代器,所以,就可以直接使用hasNext()和next()方法。
特有功能:
Object previous():获取上一个元素
boolean hasPrevious():判断是否有元素
注意:ListIterator可以实现逆向遍历,但是必须先正向遍历,才能逆向遍历,所以一