2010-03-10 55 views

回答

5

ArrayList是一个实际的数据结构,是List接口的一个实现。 Iterator只是一个接口,允许您浏览任何数据结构(只要Iterator可用于该数据结构)。

换句话说,ArrayList是物理存储在数组中的对象引用(或基元)的实际列表。 ArrayList是List接口的“实现”,意思是它提供了适用于List的所有方法的实现,例如add(object),remove(object),get(index)等。

Iterator是一种更通用的方式来浏览任何数据结构,无论是Set还是List。重要的一点是,它允许您一次导航数据结构中的每个元素,然后完成。从文档中你可以看到Iterator规定了两个方法,next()和hasNext()。 next返回底层数据结构中的下一个元素,hasNext让您知道底层数据结构中是否还有下一个元素。包含ArrayList的几个数据结构可以为您提供一个迭代器。

为什么我会使用迭代器而不是使用Arraylist的get()方法?

好吧,和许多接口一样,迭代器允许你做同样的事情,不管底层实现如何。如果我想通过某些数据结构“迭代”,我可以:

a)编写专门面向数据结构(如ArrayList)的代码,如果更改数据结构,稍后必须更改该代码到其他东西(如HashSet)或

b)从数据结构中获取Iterator,并使用相同的hasNext/next技术,即使我将数据结构更改为其他类型,也可以工作。如果您对“界面”和“实施”这两个词不太熟悉,您应该在“Java界面”上进行Google搜索。

3

一个ArrayList的方法是一种特殊类型的列表。这是一个data structure,就像树或地图或列表。

Iterator是用于遍历数据结构的design pattern的示例。您不像使用二叉树那样浏览列表,但迭代器提供的界面描述了所有数据结构导航器的共同之处。

所以你可能会使用迭代器遍历ArrayList。他们不是一回事。一个是导航器,另一个是容器。

那么,为什么你更喜欢一个迭代器,而不是仅仅使用ArrayList的get()方法?

并非所有集合都有get()方法(例如Collection和Set和二叉树)。如果您需要从ArrayList切换到其中一种数据结构,则必须重写所有调用get()的代码。

但是,如果你返回一个迭代器,代码的客户端不必知道你已经改变了实现。

如果您使用get(),则使用提供给您的实现。如果您使用Iterator接口,则可以交换实现来执行诸如智能代理之类的操作,而不会影响客户端。

这是关于隐藏一个类的客户导航的细节。如果你只是使用ArrayList,它可能并不重要。但是如果你正在设计你自己的类,你可能会发现迭代器给你提供了一种很好的方式来暴露行为而不会泄露私人细节。

2

查看Sun教程,了解如何在实现Collection接口的类(当然包括ArrayList)上使用Iterator。

这可以给你一些快速动手的例子,说明如何使用它们,这可能有助于形象化他们的差异。