Java中ListIterator和Iterator与collection

来源:互联网 发布:mac魔兽图形接口 编辑:程序博客网 时间:2024/06/06 11:55
书上说:每一个Collection实现类都有一个iterator方法,返回一个Iterator接口的对象。问题来了:Iterator接口的对象指的是Iterator接口的实现类对象,当Collection实现类调用iterator方法后,返回的Iterator对象跟Collection实现类有什么关系,怎么就能遍历该实现类了呢?例如:Iterator it = HashSet.iterator();这里的it就能遍历HashSet了?
用Iterator模式实现遍历集合Iterator模式是用于遍历集合类的标准访问方法。它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构。例如,如果没有使用Iterator,遍历一个数组的方法是使用索引:for(int i=0; i<array.size(); i++) { ... get(i) ... } 而访问一个链表(LinkedList)又必须使用while循环:while((e=e.next())!=null) { ... e.data() ... } 以上两种方法客户端都必须事先知道集合的内部结构,访问代码和集合本身是紧耦合,无法将访问逻辑从集合类和客户端代码中分离出来,每一种集合对应一种遍历方法,客户端代码无法复用。更恐怖的是,如果以后需要把ArrayList更换为LinkedList,则原来的客户端代码必须全部重写。为解决以上问题,Iterator模式总是用同一种逻辑来遍历集合:for(Iterator it = c.iterater(); it.hasNext(); ) { ... } 奥秘在于客户端自身不维护遍历集合的"指针",所有的内部状态(如当前元素位置,是否有下一个元素)都由Iterator来维护,而这个Iterator由集合类通过工厂方法生成,因此,它知道如何遍历整个集合。客户端从不直接和集合类打交道,它总是控制Iterator,向它发送"向前","向后","取当前元素"的命令,就可以间接遍历整个集合。首先看看java.util.Iterator接口的定义:public interface Iterator { boolean hasNext(); Object next(); void remove(); } 依赖前两个方法就能完成遍历,典型的代码如下:for(Iterator it = c.iterator(); it.hasNext(); ) { Object o = it.next(); // 对o的操作... } 在JDK1.5中,还对上面的代码在语法上作了简化(但是限于只读,如果需要remove,还是直接使用iterator):// Type是具体的类型,如String。 for(Type t : c) { // 对t的操作... } 每一种集合类返回的Iterator具体类型可能不同,Array可能返回ArrayIterator,Set可能返回SetIterator,Tree可能返回TreeIterator,但是它们都实现了Iterator接口,因此,客户端不关心到底是哪种Iterator,它只需要获得这个Iterator接口即可,这就是面向对象的威力。

ListIterator和Iterator详解与辨析

在使用java集合的时候,都需要使用Iterator。但是java集合中还有一个迭代器ListIterator,在使用List、ArrayList、LinkedList和Vector的时候可以使用。这两种迭代器有什么区别呢?下面我们详细分析。这里有一点需要明确的时候,迭代器指向的位置是元素之前的位置,如下图所示:

Java中ListIterator和Iterator详解与辨析

这里假设集合List由四个元素List1、List2、List3和List4组成,当使用语句Iterator it = List.Iterator()时,迭代器it指向的位置是上图中Iterator1指向的位置,当执行语句it.next()之后,迭代器指向的位置后移到上图Iterator2所指向的位置。

首先看一下Iterator和ListIterator迭代器的方法有哪些。

Iterator迭代器包含的方法有:

hasNext():如果迭代器指向位置后面还有元素,则返回 true,否则返回false

next():返回集合中Iterator指向位置后面的元素

remove():删除集合中Iterator指向位置后面的元素

ListIterator迭代器包含的方法有:

add(E e): 将指定的元素插入列表,插入位置为迭代器当前位置之前

hasNext():以正向遍历列表时,如果列表迭代器后面还有元素,则返回 true,否则返回false

hasPrevious():如果以逆向遍历列表,列表迭代器前面还有元素,则返回 true,否则返回false

next():返回列表中ListIterator指向位置后面的元素

nextIndex():返回列表中ListIterator所需位置后面元素的索引

previous():返回列表中ListIterator指向位置前面的元素

previousIndex():返回列表中ListIterator所需位置前面元素的索引

remove():从列表中删除next()或previous()返回的最后一个元素(有点拗口,意思就是对迭代器使用hasNext()方法时,删除ListIterator指向位置后面的元素;当对迭代器使用hasPrevious()方法时,删除ListIterator指向位置前面的元素)

set(E e):从列表中将next()或previous()返回的最后一个元素返回的最后一个元素更改为指定元素e

一.相同点

都是迭代器,当需要对集合中元素进行遍历不需要干涉其遍历过程时,这两种迭代器都可以使用。

二.不同点

1.使用范围不同,Iterator可以应用于所有的集合,Set、List和Map和这些集合的子类型。而ListIterator只能用于List及其子类型。

2.ListIterator有add方法,可以向List中添加对象,而Iterator不能。

3.ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator不可以。

4.ListIterator可以定位当前索引的位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。

5.都可实现删除操作,但是ListIterator可以实现对象的修改,set()方法可以实现。Iterator仅能遍历,不能修改。

三:Iterator和ListIterator用法示例

ListIterator用法:

package com.collection;

import java.util.LinkedList;import java.util.List;import java.util.ListIterator;

/** * @author 朱伟 * 链表中ListIterator测试 * */public class ListIteratorTest {

 public static void main(String[] args) {  // TODO Auto-generated method stub  List<String> staff = new LinkedList<>();  staff.add("zhuwei");  staff.add("xuezhangbin");  staff.add("taozhiwei");  ListIterator<String> iter = staff.listIterator();  String first = iter.next();    //删除zhuwei  iter.remove();    //把zhuwei改为simei  //iter.set("simei");  System.out.println("first:"+first);    iter.add("xiaobai");    //遍历List元素  System.out.println("遍历List中元素,方法一:");  for(String str : staff)   System.out.println(str+"  ");    iter = staff.listIterator();  System.out.println("遍历List中元素,方法二:");  while(iter.hasNext())  {   System.out.println(iter.next());  } }

}

Java中介者设计模式 http://www.linuxidc.com/Linux/2014-07/104319.htm

Java 设计模式之模板方法开发中应用 http://www.linuxidc.com/Linux/2014-07/104318.htm

设计模式之 Java 中的单例模式(Singleton) http://www.linuxidc.com/Linux/2014-06/103542.htm

Java对象序列化 http://www.linuxidc.com/Linux/2014-10/107584.htm

大话设计模式(带目录完整版) PDF+源代码 http://www.linuxidc.com/Linux/2014-08/105152.htm

Java中的函数传递 http://www.linuxidc.com/Linux/2014-11/109056.htm

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机流量降速怎么办 阿里巴巴买东西不发货怎么办 小朋友帮帮代写作业怎么办 连凯软件侵权怎么办 中国联通路由器网速慢怎么办 cpu铜触点掉落怎么办 商场没人气商户怎么办 58会员账号冻结怎么办 58账号冻结资金怎么办 超市买过期东西怎么办 淘宝没发货退款怎么办 申请退款发货了怎么办 51微投票异常怎么办 信用卡逾期收到律师函怎么办 淘宝商品被模仿怎么办 电脑数字间距大怎么办 有源码没有模块怎么办 花盆里有爬虫怎么办 家里有长条爬虫怎么办 有了网站源码后怎么办 第五人格闪退怎么办 超市买东西多收钱怎么办 王者荣耀换系统怎么办 夹娃娃夹子松怎么办 天猫魔盒遥控器没了怎么办 合约机被骗了怎么办 二手苹果合约机怎么办 手机系统老化了怎么办 手机显示电池老化怎么办 手机移动数据打不开怎么办 武汉移动大王卡怎么办 红米手机卡死了怎么办 红米手机死机怎么办 红米note5装卡大怎么办 手机卡二不显示怎么办 小米手机声音小怎么办 小米4手机屏幕失灵怎么办 安装包证书异常怎么办 安装包出现异常怎么办 红米手机按键失灵怎么办 红米手机内存不足怎么办