Java:迭代器和数组列表的区别

4

如果有人刚开始学Java编程,你会如何解释ArrayList和Iterators之间的区别?

为什么我要使用迭代器而不是使用ArrayList的get()方法呢?

3个回答

9
一个ArrayList是一种实际的数据结构,是List接口的一个实现。而Iterator仅仅是一种允许你遍历任何数据结构的接口(只要该数据结构有相应的Iterator)。
换句话说,ArrayList是实际存储在数组中的对象引用(或原始类型)的列表。ArrayList是List接口的“实现”,这意味着它提供了适用于List的所有方法的实现,例如add(object),remove(object),get(index)等。
Iterator是一种更通用的浏览任何数据结构的方式,无论是Set、List还是其他什么东西。有一个重要的点是,它让你能够遍历数据结构中的每个元素一次,然后就完成了。从文档中可以看到,Iterator规定了两个方法,next()和hasNext()。next返回底层数据结构中的下一个元素,hasNext让你知道底层数据结构是否有下一个元素。多个数据结构,包括ArrayList在内,都可以为你提供一个Iterator。
“为什么我要使用Iterator而不是使用Arraylist的get()方法?”好吧,像许多接口一样,Iterator允许您执行相同类型的操作,无论底层实现如何。如果我想“迭代”某个数据结构,我可以:
a)编写专门针对数据结构(例如ArrayList)的代码,如果将数据结构更改为其他内容(例如HashSet),则必须稍后更改该代码;或者
b)从数据结构中获取一个Iterator,并使用相同的hasNext/next技术,即使我将数据结构更改为其他内容,它也可以正常工作。
顺便说一下,如果您对“接口”和“实现”这些词不太熟悉,那么您可能应该在Google上搜索“Java interface”。

5

ArrayList是一种特定类型的List。它是一种数据结构,类似于树形结构、映射或列表。

迭代器是遍历数据结构的设计模式的一个例子。你不能像遍历二叉树那样遍历列表,但是迭代器提供了一个接口,描述了所有数据结构导航器的共同点。

因此,您可以使用迭代器来遍历ArrayList。它们不是同一种东西。一个是导航器,另一个是容器。

那么为什么要优先使用Iterator而不是仅使用ArrayList的get()方法呢?

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

但是,如果返回一个迭代器,则代码的客户端不必知道您已更改实现。

如果您使用get(),则使用提供给您的实现。 如果您使用Iterator接口,则可以交换实现以执行智能代理等操作,而不影响客户端。
这是关于隐藏导航细节,使类的客户端无法看到。 如果您只是使用ArrayList,可能并不重要。 但是,如果您正在设计自己的类,则可能会发现Iterator为您提供了一种很好的方式来公开行为,而不泄露私有详细信息。

2
从Sun的教程中查看this,了解如何在实现Collection接口的类(包括ArrayList)上使用迭代器。
这可以为您提供一些快速的实践例子,帮助您可视化它们的区别。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接