迭代器的概述和使用

本文详细介绍了迭代器的概念及其在Java中的使用方法,包括Iterator的基本操作、遍历自定义对象及并发修改异常的解决策略。此外,还对比了Iterator与ListIterator的不同特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

迭代器的概述和使用

什么是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;
    }

    @Override
    public String toString() {
        return "Student [name=" + name + "]";
    }
    
}

列表迭代器:

ListIterator listIterator():List集合特有的迭代器

该迭代器继承了Iterator迭代器,所以,就可以直接使用hasNext()和next()方法。

特有功能:

Object previous():获取上一个元素

boolean hasPrevious():判断是否有元素

注意:ListIterator可以实现逆向遍历,但是必须先正向遍历,才能逆向遍历,所以一

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值