java中的Iterator迭代器

Iterable接口是Java集合的顶级接口之一。Collection接口继承Iterable,所以Collection的所有子类也实现了Iterable接口。
在API中查看该接口:
在这里插入图片
在这里插入图片描述
实现了这个接口可以获得增强for循环的操作
再往下发现该接口只有一个方法:iterator
在这里插入图片描述
该方法的返回值是一个名为Iterator的接口,这个接口也被称为迭代器。
在API中查看这个接口的内容:
在这里插入图片描述
在这里插入图片描述

在这个接口下有三个方法:
在这里插入图片描述
方法hasNext():在迭代器底层其实是有一个指针指向容器内的元素,在未调用hasNext()之前,指针指向的是容器第一个元素的前一个位置。调用hasNext()方法时,如果该指针指向元素的下一个位置有元素存在, 则返回True,否则返回False。

方法next():返回指针指向的元素,并将指针下下移一个单位。
注意:如果指针指向最后一个元素,此时再调用next()会抛出异常NoSuchElementException

方法remove():从容器中移除元素。只有在调用next()后才能调用一次remove,调用后会把上面next返回的元素移除容器。
在这里插入图片描述

在这里插入图片描述

注意:迭代器在执行过程中不能对容器内的元素做增删操作(合法调用迭代器自带的remove除外),这样会使迭代器不合法,发生不可预知的后果。

对容器进行遍历有三种方式:
①普通for循环:通过下标获取元素
②使用迭代器:容器必须实现Iterator接口,在迭代器遍历过程中不能使用除迭代器自带的remove()方法对迭代器进行增删。
③增强for循环:底层使用迭代器实现,本质就是Iterator迭代器,所有在遍历过程中不能对容器进行增删操作。

示例:

public class test01 {
    public static void main(String[] args) {
        ArrayList array = new ArrayList();
        array.add(1);
        array.add(2);
        array.add(3);
        System.out.println(array);  // [1, 2, 3]
        //遍历容器的三种方法:
        //方法1:普通for循环(根据下标获取元素)
        System.out.println("========普通for循环========");
        for (int i = 0; i < array.size() ; i++) {
            System.out.println(array.get(i));
        }
        // 方法2:通过迭代器
        System.out.println("===================迭代器======================");
        Iterator iterator = array.iterator();   //调用iterator方法返回一个迭代器
        while (iterator.hasNext()) {
            Integer next = (Integer) iterator.next();
            System.out.println(next);
        }
        //方法3:增强for循环
        System.out.println("===========增强for循环================");
        for (Object i : array) {
            System.out.println(i);
        }
        // 方法2:remove()
        System.out.println("===================迭代器remove()======================");
        Iterator iterator1 = array.iterator();   //调用iterator方法返回一个迭代器
        while (iterator1.hasNext()) {
            Integer next = (Integer) iterator1.next();
            if (next.equals(2)) {
                iterator1.remove();
            }
            System.out.println(next);
        }
        System.out.println(array);  //[1, 3]
    }
}

运行结果:

[1, 2, 3]
========普通for循环========
1
2
3
===================迭代器======================
1
2
3
===========增强for循环================
1
2
3
===================迭代器======================
1
2
3
[1, 3]

扩展1:利用迭代器对容器元素进行修改

public class test02 {
    public static void main(String[] args) {
        ArrayList arr = new ArrayList();
        people p1 = new people("关羽", 10);
        people p2 = new people("张飞", 11);
        arr.add(p1);
        arr.add(p2);
        System.out.println(arr);
        Iterator iterator = arr.iterator();
        while (iterator.hasNext()) {
            people next = (people) iterator.next();
            if (next.name.equals("关羽")) {
                next.name = "刘备";
            }
            System.out.println(next);
        }
        System.out.println(arr);
    }
}
class people{
    String name;
    int age;
    public people(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "people{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

结果:

[people{name='关羽', age=10}, people{name='张飞', age=11}]
people{name='刘备', age=10}
people{name='张飞', age=11}
[people{name='刘备', age=10}, people{name='张飞', age=11}]

扩展2:增强for循环与迭代器

 //方法3:增强for循环
        System.out.println("===========增强for循环================");
        for (Object i : array) {
            System.out.println(i);
        }

对上面代码进行反编译:

	System.out.println("===========增强for循环================");
    for (Integer next = array.iterator(); next.hasNext(); ) {
                                                            Object i = next.next();
      System.out.println(i);
    }

可以看到增强for循环底层就是利用迭代器实现的…

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值