7.集合框架(迭代器的原理及源码解析)(了解)
a.什么是迭代器呢?
其实就是集合的取出元素的方式。如同抓娃娃游戏机中的夹子。
迭代器是取出方式,会直接访问集合中的元素。所以将迭代器通过内部类的形式来进行描述。
通过容器的iterator()方法获取该内部类的对象。
b.迭代器原理
* 迭代器原理:迭代器是对集合进行遍历,而每一个集合内部的存储结构都是不同的,所以每一个集合存和取都是不一样,
那么就需要在每一个类中定义hasNext()和next()方法,这样做是可以的,但是会让整个集合体系过于臃肿,
迭代器是将这样的方法向上抽取出接口,然后在每个类的内部,定义自己迭代方式,
这样做的好处有二,第一规定了整个集合体系的遍历方式都是hasNext()和next()方法,第二,代码有底层内部实现,
使用者不用管怎么实现的,会用即可
c.迭代器原理图
迭代器原理图:
集合中存放元素,想要操作元素,在集合内部操作最方便,所以就定义了一个内部类,完成取出动作的定义,而每个容器中都有内部类,
发现以后再产生容器还得定义内部类,干脆抽取出一个接口每个容器中都有存和取的方式,而且因为每个容器的数据结构不同,
所以他们存和取的动作也有可能实现的方式不一样,虽然都具备存和取的动作,但是底层的数据结构不同,存取方式也不同,
具体实现方式不一样,每个集合都具备取出方式,而这个方式不足以用一个方法来描述,不像添加那么简单,去之前要判断有没有,
有就取,没有就不取,所以对于取出不足以用一个方法来描述,就将取出动作封装成对象.
d.迭代器源码解析
* 1,在eclipse中ctrl + shift + t找到ArrayList类
* 2,ctrl+o查找iterator()方法
* 3,查看返回值类型是new Itr(),说明Itr这个类实现Iterator接口
* 4,查找Itr这个内部类,发现重写了Iterator中的所有抽象方法
e.根据ArrayList集合内部迭代器的总结如下:
1.要想获取集合内部的事物,在集合内部操作最方便,而获取集合内部的事物,不足以用一个方法来描述,最起码要判断有没有(hasNext),
有就取出(next),不需要就删除(remove),所以就干脆在集合内部定义一个类叫做迭代器(用于获取集合中的元素),即内部类,
因为内部类可以直接访问外部类的成员变量,包括私有.
2.因为所有集合都要在内部定义迭代器,这样每个集合的内部迭代器都不一样,不方便统一管理,
所以干脆在外面定义一个迭代器的接口Iterator,这样所有的集合在其内部定义迭代器时统一实现该接口,方便管理.
3.这样所有集合内部都有了自己的迭代器,那么如何让使用者在外部才能获取到该迭代器呢?解决方法,
在每个集合内部定义一个获取该集合迭代器的方法iterator,而如果每个集合都定义自己的iterator方法的话,
仍然不方便管理,所以干脆在单列集合的根接口Collection中定义一个获取迭代器的方法public Iterator iterator(),
这样所有实现Collection接口的实现类中只需要重写该iterator方法,返回自己的迭代器对象即可.
ArrayList list = new ArrayList();
Iterator it = list.iterator();
while(it.hasNext()){
it.next();
} |
|