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,AbstractList,ArrayList,等类,它的方法有
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,那么游标移动的可能就不是你想要的那个指向了。
这就是个人对迭代器原理的一点拙见,欢迎大家来访,如有不足,敬请指正。
感谢来访,分享无价,评论有礼!呵呵