使用Java枚举/迭代器

时间:2011-04-14 01:23:45

标签: java vector iterator enumeration

我正在漫游API,我注意到,Enumerations和Iterators不是非常有用的接口。

具体来说,我的意思是,而不是说(对于Vector v):

for (Enumeration<E> e = v.elements(); e.hasMoreElements();)
   System.out.println(e.nextElement());

我们可以很容易地说:

for (int i = 0; i < v.size(); i++)
   System.out.println(v.elementAt(i));

我想知道的是:

使用Enumerations / Iterators是否有任何性能奖励?

它是否为您提供了实现后者循环无法实现的功能?

5 个答案:

答案 0 :(得分:7)

我认为迭代器和枚举不是关于性能的;他们是关于更好的抽象。

如果您有迭代器,则无需了解基础数据结构。这就是我认为界面完全可以接受的原因。我不同意你的说法,即Iterator不是一个有用的界面。你会添加什么方法?

答案 1 :(得分:7)

并非所有拥有Iterator的内容都是随机访问List。例如,Set不允许索引访问。 LinkedList允许它,但按索引循环会有糟糕的表现。

其他非Collection的内容都有Iterator个,或者也可以表示为Iterator。例如,可以使用Iterator表示无限序列。

拥有一个用于迭代事物的简单通用接口允许可以在尽可能多的对象上操作的方法。

另外,VectorEnumeration都已过时,现在基本上已被ArrayListIterator替换为现代Java。

答案 2 :(得分:3)

除了以下事实:当您尝试在集合中处理值时,枚举器和迭代器更能表达您尝试执行的操作,并将特定集合类型的详细信息抽象为duffymo提到的,Iterator接口允许您使用更加优雅的for语法,例如:

List<String> list = new ArrayList<String>();
for(String entry : list)
{
    System.out.println(list);
}

答案 3 :(得分:0)

使用Iterator.hasNext()方法迭代时修改列表是安全的。如果你只是检查索引是否小于原始大小,你可能会遇到问题......

答案 4 :(得分:0)

迭代器是关于解耦和封装的。您不需要关心数据结构的差异,迭代器具有独特的API公开。因此,即使集合发生变化,客户端代码也不需要太多的重构。 在jdk 1.5之前,我们使用interface来管理一些静态的final字段。您可以通过编写一些示例代码来比较它们 - (枚举支持切换,例如)