您的位置:首页 > 其它

迭代器

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循环访问的形式看着更好看,写起来更方便。但如有删除操作,当然还是用它原来的形式了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: