迭代器
2016-03-02 15:49
260 查看
迭代法迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。迭代法又分为精确迭代和近似迭代。“二分法”和“牛顿迭代法”属于近似迭代法。迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。迭代器是一种对象,它能够用来遍历STL容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为上象迭代器的东西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容器和通用算法有机的统一起来。迭代器提供一些基本操作符:*、++、==、!=、=。这些操作和C/C++“操作array元素”时的指针接口一致。不同之处在于,迭代器是个所谓的smartpointers,具有遍历复杂数据结构的能力。其下层运行机制取决于其所遍历的数据结构。因此,每一种容器型别都必须提供自己的迭代器。事实上每一种容器都将其迭代器以嵌套的方式定义于内部。因此各种迭代器的接口相同,型别却不同。这直接导出了泛型程序设计的概念:所有操作行为都使用相同接口,虽然它们的型别不同。---------------------------------------------------------迭代器是一种对象,它能够用来遍历STL容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为上象迭代器的东西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容器和通用算法有机的统一起来。说的简单点,就是对容器中的元素进行遍列,每次取出一个元素,然后对元素进行操作。-----------------------------------------------------迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。 Java中的Iterator功能比较简单,并且只能单向移动: (1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。 (2) 使用next()获得序列中的下一个元素。 (3) 使用hasNext()检查序列中是否还有元素。 (4) 使用remove()将迭代器新返回的元素删除。 Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。----------------------------------------集合实现一般有2个值来累计一共被修改了多少次,迭代器的next方法执行要监测exceptedModCount和modCount是否一致,容器remove方法只改变modCount不改变exceptedModCount,也就是预期的修改次数和真正修改次数不一致,抛出ConcurrentModificationException。-------------------------
迭代器是一个可以被for/each循环遍历的数据结构,原理上就是继承了Iterable接口的类需要实现Iterable的一个方法iterator(),这个方法返回一个可以被for/each循环遍历的迭代器Iterator,然后for/each就可以遍历这个迭代器中的内容。这个迭代器也是一个接口,而这个接口具有方法hasNext()和next(),使用这两个方法来遍历迭代器中的内容。如: Set<String> obj = new HashSet<String>(); for(String s:obj) System.out.println(s); 这个变换一下就相当于: for(Iterator it = obj.iterator();it.hasNext();) System.out.println(it.next());
---------------------------------------------------------for each语句是由iterator实现的,正如你所说,他们的不同之处就在于remove()方法上。一般调用删除方法都是集合的方法,例如:List list = new ArrayList();list.add(...);list.remove(...);但是,如果在循环的过程中调用集合的remove()方法,就会导致循环出错,例如:for(int i=0;i<list.size();i++){list.remove(...);}循环过程中list.size()的大小变化了,就导致了错误。所以,如果你想在循环语句中删除集合中的某个元素,就要用迭代器iterator的remove()方法,因为它的remove()方法不仅会删除元素,还会维护一个标志,用来记录目前是不是可删除状态,例如,你不能连续两次调用它的remove()方法,调用之前至少有一次next()方法的调用。如果你想了解的更透彻,可以查看一下原码,看它是怎么实现的。因为for each语句是由iterator语句实现的,所以如果你在循环中删除某个元素时,应该用iterator的remove()方法,可是这时你又没有iterator对象,怎么调用呢?所以,这种情况下,一般还是用iterator来循环访问,并筛选删除。说白了,for each就是为了让用iterator循环访问的形式看着更好看,写起来更方便。但如有删除操作,当然还是用它原来的形式了。
相关文章推荐
- Cordova 系列之Mac OS 环境配置
- MongoDB添加用户
- json 语法
- RNN 入门教程 Part 4 – 实现 RNN-LSTM 和 GRU 模型
- DrawerLayoutAndroid如何通过点击事件打开
- UITableable代理执行的顺序
- android studio 学习笔记
- Exchange2013/2016 ECP/OWA无法打开主页Event 1310 Net 4.0
- 机器学习一小步:Kaggle上的练习Titanic: Machine Learning from Disaster(二)
- Android应用启动后自动创建桌面快捷方式
- window遍历文件夹下的文件 http://bbs.csdn.net/topics/390368005/
- MyEclipse配置Tomcat没有Tomcat选项没有小猫图
- Vim使用笔记
- Rabbitmq 开发说明
- js获取所点击<a>的href值
- C++第一次实验
- 【转】解释器模式
- 滚来滚去,滚来滚去...Scroller完全解析
- 技术学习论坛地址收集
- 给系统的UITabbarViewController 的tabBarItem 添加图片的问题