迭代器原理探究


Iterator是个接口,我们在使用时一般都是定义一个集合,然后集合调用接口再之后用hasNext,next来遍历集合的,那么Iterator是怎么实现的呢,它是一个接口,谁来实现它呢?
     这边博文就这个问题和大家一起进行下探究,希望大家能有所收获,先抛出一个应用实例:

                   publicstaticvoid main(String[]args) {

       // 定义一个集合,集合的特点是可以接收各类数据类型

       Collection col=newArrayList();

       col.add("abcd");

       col.add(234);

       col.add(true);

       col.add('a');

    //获取迭代器接口的实现类对象,有的同学这里会有疑问,Collection col=后面的

//不是应该有个new什么的吗,怎么是对象直接调用方法啊???

       Iterator it=col.iterator();

       //循环条件hasNext返回true,就可以循环获取

       while(it.hasNext()){

           System.out.println(it.next());

       }

    }

}
 

那么Iterator it=col.iterator();究竟做了什么为什么后面不是new呢?分别对程序代码进行分解,并查看API我们知道这三者的关系:

 

Iterator:   是个接口,它的实现类有BeanContextSupport,BCSIterator,

           EventReaderDelegate, Scanner等 它是对 collection 进行迭代的迭

代器,它有hasNext(判断是还否有元素),next(获取下一个元素),remove(移除元素一般不用)三个方法。

Col:         是Collection的一个对象,Collection也是一个接口,它的实现类有

AbstractCollection,AbstractListArrayList,等类,它的方法有

iterator()等;

iterator():  方法,返回在此collection的元素上进行迭代的迭代器。

 

那么现在我们看Iterator it=col.iterator();

 
其实就是:
Iterator类+对象名it =(赋予)(Collection对象. Iterator
在通俗点就是Collection的对象col调用了本类中的Iterator方法返回一个iterator对象,然后使用了一个Iterator类接收对象并将对象起名it这样就符合了类+类名=new 类的创建对象的格式,通过查API解决了这个问题,那么我们再来更加深入了解下它的源代码

//这是个多态,通过多态创建Arraylist()对象

Collection col=new ArrayList();

//调用对象的add方法

col.add("abcd");

       ………

       //获取迭代器接口的实现类对象

       (Iterator it=col.iterator();

 

/*

通过对象调用ArrayList中的iterator方法,而iterator中有一个Itr的内部私有类,iterator方法可以返回一个Itr的内部私有类,而这个内部私有类,实现了类Iterator中的抽象方法hasNext,和方法next)

*/

 

       //循环条件hasNext返回true,就可以循环获取,实际上我们

//调用的hasNext(),next()是iterator方法返回的内部类Itr的//方法

       while(it.hasNext()){

           System.out.println(it.next());

}

到了这里,是不是对迭代器的源码有所了解了呢?我们通过一张图来说明关系

 

另外在,使用迭代器中要注意几点:

                                     |-- 不允许同时多次next方法

                                    |--不允许迭代中,用集合方法修改集合的长度

                                    |-- 迭代器使用一次,必须从新获取迭代器

         因为在迭代器中hasNext()方法中定义了一个游标cursor这个游标初始指向的是0,有next时它就向下一个位置移动,如果在迭代器中多次出现next,那么游标移动的可能就不是你想要的那个指向了。

         这就是个人对迭代器原理的一点拙见,欢迎大家来访,如有不足,敬请指正。

感谢来访,分享无价,评论有礼!呵呵

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值