JAVA迭代器

迭代器的解释

迭代器(iterator)是一种对象也是一种设计模式,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。迭代器是跟容器紧密结合的,不同的容器,它的迭代器不同,但是,他们有共同的目标,就是可以通过该迭代器,来遍历访问这个容器里面的元素。这样带来的好处是在STL设计算法时,可以脱离容器而设计更加通用的算法。有了迭代器,我们可以将算法和特定的容器分离开来。

迭代器的功能

使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素,使用next()获得序列中的下一个元素,使用hasNext()检查序列中是否还有元素,使用remove()将迭代器新返回的元素删除,并且在遍历list或者map等对象的时候,效率比较高,而且能实现一些for循环不能实现的功能。

迭代器与foreach的关系

for eachjdk5.0新增加的一个循环结构,可以用来处理集合中的每个元素而不用考虑集合定下标。 格式如下

for(variable:collection){ statement; }    

定义一个变量用于暂存集合中的每一个元素,并执行相应的语句 ( ) collection 必须是一个数组或者是一个实现了 lterable 接口的类对象。看下面这个例子:

    import java.util.*;    
        
    public class TestIterator {    
        
        public static void main(String[] args) {    
            List<String> list = new ArrayList<String>();    
                
            for (int i = 0; i < 10; i++) {    
                list.add(new String("list" + i));    
            }    
            for (String str : list) {    
                System.out.println(str);    
            }    
        }    
    }    
可以看出 , 使用 for each 循环语句的优势在于更加简洁,更不容易出错,不必关心下标的起始值和终止值。 forEach 不是关键字 , 关键字还是 for, 语句是由 iterator 实现的,他们最大的不同之处就在于 remove() 方法上。 一般调用删除和添加方法都是具体集合的方法,例如:

List list = new ArrayList(); list.add(a); list.remove(a); 

但是,如果在循环的过程中调用集合的remove()方法,就会导致循环出错,因为循 环过程中list.size()的大小变化了,就导致了错误。 所以,如果想在循环语句中删除集合中的某个元素,就要用迭代器iteratorremove()方法,因为它的remove()方法不仅会删除元素,还 会维护一个标志,用来记录目前是不是可删除状态,例如,你不能连续两次调用它的remove()方法,调用之前至少有一次next()方法的调用。 foreach就是为了让用iterator循环访问的形式简单,写起来更方便。当然功能不太全,所以但如有删除操作,还是要用它原来的形式。

使用for循环与使用迭代器iterator的对比

在效率方面的对比: 采用ArrayList对随机访问比较快,而for循环中的get()方法,采用的即是随机访问的方法,因此在ArrayList里,for循环较快。但是,采用LinkedList则是顺序访问比较快,iterator中的next()方法,采用的即是顺序访问的方法,因此在LinkedList里,使用iterator较快。

从数据结构角度分析,for循环适合访问顺序结构,可以根据下标快速获取指定元素.Iterator 适合访问链式结构,因为迭代器是通过next()Pre()来定位的.可以访问没有顺序的集合。

使用 Iterator 的好处在于可以使用相同方式去遍历集合中元素,而不用考虑集合类的内部实现(只要它实现了 java.lang.Iterable 接口),如果使用 Iterator 来遍历集合中元素,一旦不再使用 List 转而使用 Set 来组织数据,那遍历元素的代码不用做任何修改,如果使用 for 来遍历,那所有遍历此集合的算法都得做相应调整,因为List有序,Set无序,结构不同,他们的访问算法也不一样。

最后通过一个具体的例子来看JAVA迭代器的使用,源代码如下:

    import java.util.*;    
        
    public class TestIterator {    
        
        public static void main(String[] args) {    
            ArrayList l = new ArrayList();    
            l.add("1");    
            l.add("2");    
            l.add("3");    
            for (Iterator iter = l.iterator(); iter.hasNext();) {    
                String str = (String) iter.next();    
                System.out.println(str);    
            }    
            /* 迭代器用于while循环 */    
            Iterator iter = l.iterator();    
            while (iter.hasNext()) {    
                String str = (String) iter.next();    
                System.out.println(str);    
            }    
        
        }    
    }    


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值