日期: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()); } } ///:~
细心研究一下打印办法:
注意此中没有与序列范例有关的信息.我们拥有的全部东西就是Enumeration.为理解有关序列的情形,一个Enumeration便充足了:可获得下一个对象,亦可知道能否已到达了末尾.获得一系列对象,然后在此中遍历,从而履行一个特定的操作——这是一个颇有代价的编程概念,本书很多地方城市相沿这一思绪.static void printAll(Enumeration e) { while(e.hasMoreElements()) System.out.println( e.nextElement().toString()); }
这个看似特别的例子乃至可以更为通用,因为它利用了通例的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编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论