当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:17:00  来源:本站整理

<b>java的摆列器(反复器)</b>[Java编程]

赞助商链接



  本文“<b>java的摆列器(反复器)</b>[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
在任何调集类中,必须通过某种办法在此中置入对象,再用另一种办法从中获得对象.毕竟,包容各种各样的对象恰是调集的主要任务.在Vector中,addElement()就是我们插入对象采取的办法,而elementAt()是提取对象的唯一办法.Vector非常机动,我们可在任什么时刻候挑选任何东西,并可以利用差别的索引挑选多个元素.
若从更高的角度看这个问题,就会发现它的一个缺陷:需求事前知道调集的精确范例,不然无法利用.乍看来,这一点仿佛没什么关系.但假如最开始决意利用Vector,后来在程序中又决意(考虑履行效率的缘由)改变成一个List(属于Java1.2调集库的一部份),这时又该若何做呢?
可操纵“反复器”(Iterator)的概念到达这个目的.它可以是一个对象,作用是遍历一系列对象,并挑选那个序列中的每个对象,同时不让客户程序员知道或关注那个序列的底子构造.此外,我们普通认为反复器是一种“轻量级”对象;也就是说,成立它只需付出极少的代价.但也恰是由于这个缘由,我们常发现反复器存在一些仿佛很奇特的限制.比方,有些反复器只能朝一个方向移动.
Java的Enumeration(列举,注释②)就是具有这些限制的一个反复器的例子.除下面这些外,不可再用它做其他任何事情:
(1) 用一个名为elements()的办法要求调集为我们供应一个Enumeration.我们初次调用它的nextElement()时,这个Enumeration会返回序列中的第一个元素.
(2) 用nextElement()得到下一个对象.
(3) 用hasMoreElements()查抄序列中能否还有更多的对象.

②:“反复器”这个词在C++和OOP的其他地方是常常呈现的,所以很难肯定为什么Java的开辟者采取了这样一个奇特的名字.Java 1.2的调集库改正了这个问题以及其他很多问题.

只可用Enumeration做这些事情,不能再有更多.它属于反复器一种简单的实现方法,但功效仍然非常强盛.为领会它的运作历程,让我们复习一下本章早些时刻提到的CatsAndDogs.java程序.在原始版本中,elementAt()办法用于挑选每一个元素,但在下述订正版中,可看到利用了一个“列举”:
//: CatsAndDogs2.java
// Simple collection with Enumeration
import java.util.*;

class Cat2 {
  private int catNumber;
  Cat2(int i) {
    catNumber = i;
  }
  void print() {
    System.out.println("Cat number " +catNumber);
  }
}

class Dog2 {
  private int dogNumber;
  Dog2(int i) {
    dogNumber = i;
  }
  void print() {
    System.out.println("Dog number " +dogNumber);
  }
}

public class CatsAndDogs2 {
  public static void main(String[] args) {
    Vector cats = new Vector();
    for(int i = 0; i < 7; i++)
      cats.addElement(new Cat2(i));
    // Not a problem to add a dog to cats:
    cats.addElement(new Dog2(7));
    Enumeration e = cats.elements();
    while(e.hasMoreElements())
      ((Cat2)e.nextElement()).print();
    // Dog is detected only at run-time
  }
} ///:~

我们看到唯一的改变就是最后几行.不再是:

for(int i = 0; i < cats.size(); i++)
((Cat)cats.elementAt(i)).print();

而是用一个Enumeration遍历整个序列:

while(e.hasMoreElements())
((Cat2)e.nextElement()).print();

利用Enumeration,我们没必要关心调集合的元素数目.全部工作均由hasMoreElements()和nextElement()自动照管了.
下面再看看另一个例子,让我们成立一个通例用处的打印办法:
//: HamsterMaze.java
// Using an Enumeration
import java.util.*;

class Hamster {
  private int hamsterNumber;
  Hamster(int i) {
    hamsterNumber = i;
  }
  public String toString() {
    return "This is Hamster #" + hamsterNumber;
  }
}

class Printer {
  static void printAll(Enumeration e) {
    while(e.hasMoreElements())
      System.out.println(
        e.nextElement().toString());
  }
}

public class HamsterMaze {
  public static void main(String[] args) {
    Vector v = new Vector();
    for(int i = 0; i < 3; i++)
      v.addElement(new Hamster(i));
    Printer.printAll(v.elements());
  }
} ///:~

细心研究一下打印办法:
static void printAll(Enumeration e) {
  while(e.hasMoreElements())
    System.out.println(
      e.nextElement().toString());
}
注意此中没有与序列范例有关的信息.我们拥有的全部东西就是Enumeration.为理解有关序列的情形,一个Enumeration便充足了:可获得下一个对象,亦可知道能否已到达了末尾.获得一系列对象,然后在此中遍历,从而履行一个特定的操作——这是一个颇有代价的编程概念,本书很多地方城市相沿这一思绪.
这个看似特别的例子乃至可以更为通用,因为它利用了通例的toString()办法(之所以称为通例,是由于它属于Object类的一部份).下面是调用打印的另一个办法(固然在效率上大概会差一些):
System.out.println("" + e.nextElement());
它采取了封装到Java内部的“自动转换成字串”技术.一旦编译器碰到一个字串,背面跟随一个“+”,就会但愿背面又跟随一个字串,并自动调用toString().在Java 1.1中,第一个字串是不必要的;全部对象城市转换成字串.亦可对此履行一次造型,得到与调用toString()一样的效果:
System.out.println((String)e.nextElement())
但我们想做的事情普通并不但仅是调用Object办法,所以会再度面对范例造型的问题.关于自己感爱好的范例,必须假定自己已得到了一个Enumeration,然后将后果对象造型成为那种范例(若操作错误,会得到运行期违例).
  以上是“<b>java的摆列器(反复器)</b>[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .