Java集合中使用迭代器

1、什么是迭代器

迭代器实际上是一种设计模式,廖老师的博客是这样解释的:
提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。
在java的集合中广泛的使用迭代器。

2、为什么要用迭代器

使用迭代器的好处是可以在不需要了解集合内部的实现过程的情况下实现对集合的遍历;另一方面,具体来看如果使用索引的方式遍历LinkedList会效率很低,set集合则无法使用索引,所以综合来看,最好是使用迭代器来遍历集合

3、怎么用迭代器

集合提供了获取迭代器的方法:

  • 基本使用:
public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<>();
        list.add("aa");
        list.add("bb");
        list.add("cc");
        for (Iterator<String> it = list.iterator(); it.hasNext(); ) { 
            System.out.println(it.next());  
        }
}

使用foreach循环实际上也是使用迭代器,编译器编译完后就是上面的代码

4、注意事项

  • 在需要遍历集合并删除集合元素时可能会报异常:ConcurrentModificationException
  • 代码如下
public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<>();
        list.add("aa");
        list.add("bb");
        list.add("cc");
        int temp = 1;
        for (Iterator<String> it = list.iterator(); it.hasNext(); ) {
            if(temp == 2){
                list.remove();
            }
            temp++;
            System.out.println(it.next());
        }
 }

上面代码会报异常:ConcurrentModificationException,因外调用的是list集合的remove()方法;
怎么避免异常:

public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<>();
        list.add("aa");
        list.add("bb");
        list.add("cc");
        int temp = 1;
        for (Iterator<String> it = list.iterator(); it.hasNext(); ) {
        	System.out.println(it.next());
            if(temp == 1){
                it.remove();
            }
            temp++;
        }
}

注意:it.next();要在it.remove();前面。不然会报错IllegalStateException
这里最好把迭代器当作一个遍历链表的过程,it就是一个指针(java没有指针的概念),如下图
在这里插入图片描述
进入for循环时it指向-1的位置,进来后需要手动it.next();到第一个元素位置,这样就比较好理解了

总结:

  1. 迭代器最好只用来遍历,遍历的过程中不要删除集合中的元素;
  2. foreach(增强for)也是用迭代器实现的,使用过程中也要注意上面一点,并且他不能完成删除元素的;
  3. 真要删除元素时,注意for循环的写法和,next()与remove()的位置;
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值