java程序员从笨鸟到菜鸟之(二十四)集合之迭代器

迭代器

Collection的iterator()方法先使用---语法 Iterator it=list.iteratior();说明:list表示集合对象的引用,而list.iteratior()返回的是Iterator的接口的子对象,为什么是通过方法创建的子对象?子对象是怎么创建的?(被封装起来了,稍后介绍)

Iterator it=list.iteratior()此行代码的作用:获取迭代器对象,进而取出集合的元素

:关于iterator()方法使用可以参考上一篇博客

注意

如果使用Itreator迭代器遍历过程中,而在调用此方法的集合对象中添加元素,则会出现异常---java.util.ConcurrentModificationException---并发修改异常

API对此方法的描述Iterator<E> iterator()---返回值类型 Iterator接口

回顾:接口型的引用只能指向自己子类的对象;而此处这个对象(it)不是直接new出来的,而是通过集合中的方法获取出来的,获取出来有什么好处?它里面有个hasNext()和next()方法

对hasNext()和next()方法使用可以参考上一篇博客的代码

迭代器概念:迭代器只是个专业用词(理解其等价意思就可以了),其实就是集合的取出元素的方式(遍历方式)

迭代器特点:(迭代次内部实现方式)

        每一个容器都有存和取的方式,而且因为每一个容器的数据结构(底层)不一样,所以存取的动作有可能实现方式也不一样,具体实现方式不同,eg:顶层Collection集合的add()方法,每一个子类有不同的实现方式;也即每个集合都有自己的存取方式,而这个取出的方式不足以用一个方法(函数)来描述,不像添加那么简答,需要用多个方法(功能)来体现-----于是就把取出这个动作封装成一个对象,所以每个容器里都有一个取出的对象,而且由于每个数据结构不同,每个结构的取出的实现方式(细节)不同;取出怎么来描述的呢?通过一个类来完成的,这个类就定义在集合内部----取出(这个)类就定义在集合内部;这是为什么呢?因为元素在集合中,你操作的是元素,你想直接操纵集合元素,在集合内部定义最方便,所以就在集合内部定义了一个内部类,这个内部类就完成了取出动作的定义,每个容器都有内部类,以后会发现再产生容器也有这些东西;再看容器,会发现集合中容器都有这个方法(判断,取出),而怎么判断?怎么取出?依赖于容器自身的特点(数据结构),就把取出方式定义在集合内部,这样取出方式就可以直接访问集合内部的元素,那么取出方式就被定义成了内部类,统一了取出方式,那么再新加集合也不怕?因为他们都用Iterator来取,不需要挨个写内部类,用统一规则做这件事情

一个比喻:抓娃娃

       问题描述:投币,通过手杆箱大箱子里用夹子娃娃。那么大箱子就理解成集合,娃娃理解成集合的元素;每个娃娃有不同的排列方式,现在要把布娃娃取出来,夹子就是取出方式,这个夹子(传说中的迭代器),这个夹子定义在大箱子(容器)内部,这个夹子是复杂的事物(体现在:夹子要移动,打开,闭合),这些都是对象中的方法。现在指挥夹子做事情,可以说夹子就是迭代器,被封装在内部,而且很多游戏机的夹子不一样(多种),实现方式(夹东西)不一样,不管实现方式一不一样,它们都有固定的方法,都有移动、打开、闭合、夹东西,但是这些东西是被封装在内部的,是不能直接拿出夹子的,只能通过投了币以后,通过操纵杆来操纵,叫做这个容器对外暴露的功能-----操纵杆,通过操纵杆就能使用这个对象,夹子换成什么样都不重要,只要操纵操纵杆,将操纵杆与夹子紧密程度降低了(夹子的具体实现方式与我的操纵杆无关)

源代码的具体实现:

java程序员从笨鸟到菜鸟之(二十四)集合之迭代器

蓝框标记的地方表示:Itr类是接口的一个子实现类(私有),对hasNext()和next()不同实现方法

java程序员从笨鸟到菜鸟之(二十四)集合之迭代器

说明:以内部类的形式返回此接口的子实现类的对象

1 为什么不定义在外部?

内部事务:容器是一类事物,容器内部还有一类事物,叫内部类。如果定义在外部,要访问集合的元素,还得创建集合对象,而通过内部事务(内部类形式)可以直接访问容器内部成员,这就是内部类的设计。

内部事务(内部类)实现一个接口,内部的事务还对外提供了一个规则,我们只要面对规则就行了,内部的实现跟我们没关系(不管实现细节)。

补充:

1---集合中为什么有很多容器?
因为每一个容器对数据的存储方式都有不同,这个存储方式称之为数据结构

链接:1--点击打开链接,2--点击打开链接,3--点击打开链接,4--点击打开链接,5--点击打开链接,6--点击打开链接