Iterator迭代器和增强for循环

Iterator迭代器

接口 Iterator

public interface Iterator<E>

Collection 进行迭代的迭代器。迭代器取代了 Java Collections Framework 中的 Enumeration。迭代器与枚举有两点不同:

  • 迭代器允许调用者利用定义良好的语义在迭代期间从迭代器所指向的 collection 移除元素。
  • 方法名称得到了改进。
方法摘要
booleanhasNext() :如果仍有元素可以迭代,则返回 true
Enext:返回迭代的下一个元素。
voidremove() :从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。

子接口ListIterator

public interface ListIterator<E>

系列表迭代器,允许程序员按任一方向遍历列表、迭代期间修改列表,并获得迭代器在列表中的当前位置。ListIterator 没有当前元素;它的光标位置始终位于调用 previous() 所返回的元素和调用 next() 所返回的元素之间。长度为 n 的列表的迭代器有 n+1 个可能的指针位置,如下面的插入符举例说明:
在这里插入图片描述

方法摘要
voidadd(E e):将指定的元素插入列表(可选操作)。
booleanhasNext():以正向遍历列表时,如果列表迭代器有多个元素,则返回 true(换句话说,如果 next 返回一个元素而不是抛出异常,则返回 true)。
booleanhasPrevious():如果以逆向遍历列表,列表迭代器有多个元素,则返回 true
Enext():返回列表中的下一个元素。
intnextIndex():返回对 next 的后续调用所返回元素的索引。
Eprevious():返回列表中的前一个元素。
intpreviousIndex():返回对 previous 的后续调用所返回元素的索引。
voidremove():从列表中移除由 nextprevious 返回的最后一个元素(可选操作)。
voidset(E e):用指定元素替换 nextprevious 返回的最后一个元素(可选操作)。

注意,remove()set(Object)方法不是根据光标位置定义的;它们是根据对调用 next()previous()所返回的最后一个元素的操作定义的。

接下来我们对这几个方法进行使用:

//迭代器遍历输出集合
public class Demo1 {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        ListIterator<Integer> iterator = list.listIterator();
        while (iterator.hasNext()){//如果集合里有元素则继续循环
            System.out.println(iterator.next());//返回光标在此位置的元素
        }
    }
}

答案显然为
在这里插入图片描述

但如果我们在遍历集合之前使用了next()方法:

public class Demo1 {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        ListIterator<Integer> iterator = list.listIterator();
        iterator.next();
        iterator.next();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}

答案是
在这里插入图片描述

因为我们执行了两次next()方法,所以我们的光标往下移了两位,在循环里第一次next()后光标指向集合的第三个元素。

我们使用一下ListIterator中的add(E e)方法:

public class Demo1 {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        ListIterator<Integer> iterator = list.listIterator();
        iterator.add(100);
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}

答案还是
在这里插入图片描述

为什么我们迭代器循环的时候,并没有将100这个值输出出来呢?但是其实他是在集合中的,只不过调用ListIterator中的add(E e)方法时,它将值插入到了集合的最上面,下面我们来看这个方法的具体介绍:

add(E e):将指定的元素插入列表(可选操作)。该元素直接插入到 next 返回的下一个元素的前面(如果有),或者 previous 返回的下一个元素之后(如果有);如果列表没有元素,那么新元素就成为列表中的唯一元素。新元素被插入到隐式光标前:不影响对 next 的后续调用,并且对 previous 的后续调用会返回此新元素(此调用把调用 nextIndex 或 previousIndex 所返回的值增加 1)。

它将值插入在了0的位置,0下标变为1下标…以此类推。

所以接下来我们调用一下previous()方法:

public class Demo1 {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        ListIterator<Integer> iterator = list.listIterator();
        iterator.add(100);
        iterator.previous();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}

答案是
在这里插入图片描述

显然,我们输出了100这个值。

增强for循环

增强for循环本质是迭代器。

增强for循环(也称for each循环)是 JDK1.5 以后出来的一个高级for循环,专门用来遍历数组和集合的。它的内部原理其实是个Iterator迭代器,所以在遍历的过程中,不能对集合中的元素进行增删操作。

格式:

for(元素的数据类型 变量名称 : Collection集合or数组){
	//代码
}

遍历数组:

public class Demo1 {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        for (int i : arr) {
            System.out.println(i);
        }
    }
}

遍历集合:

public class Demo1 {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        for (Integer i : list) {
            System.out.println(i);
        }
    }
}

小贴士:

Iterator迭代器只能遍历Collection集合。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小成同学_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值