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

Posted

技术标签:

【中文标题】Java:迭代器和数组列表之间的区别【英文标题】:Java: The difference between iterators and arraylists 【发布时间】:2011-01-25 16:45:36 【问题描述】:

你会如何向刚开始使用 Java 编程的人解释 ArrayList 和 Iterator 之间的区别是什么?

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

【问题讨论】:

【参考方案1】:

ArrayList 是一种特殊的列表。这是一个data structure,就像一棵树、一张地图或一个列表。

Iterator 是 design pattern 的示例,用于遍历数据结构。导航列表的方式与导航二叉树的方式不同,但迭代器提供了一个接口,该接口描述了所有数据结构导航器的共同点。

因此,您可以使用迭代器遍历 ArrayList。他们不是一回事。一个是导航器,另一个是容器。

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

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

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

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

这是关于向类的客户隐藏有关导航的详细信息。如果您只使用 ArrayList 可能并不重要。但是,如果您正在设计自己的类,您可能会发现 Iterator 为您提供了一种在不泄露私有细节的情况下公开行为的好方法。

【讨论】:

【参考方案2】:

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

这可以为您提供一些关于如何使用它们的快速动手示例,这可能有助于可视化它们的差异。

【讨论】:

【参考方案3】:

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

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

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

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

嗯,就像许多接口一样,无论底层实现是什么,Iterator 都允许您做同样的事情。如果我想“迭代”一些数据结构,我可以

a) 编写专门针对数据结构(例如 ArrayList)的代码,如果我将数据结构更改为其他东西(例如 HashSet)或

b) 从数据结构中获取一个迭代器,并使用相同的 hasNext/next 技术,即使我将数据结构更改为其他内容也可以使用。

仅供参考,如果您不太熟悉“接口”和“实现”这两个词,您可能应该在 Google 上搜索“Java 接口”。

【讨论】:

以上是关于Java:迭代器和数组列表之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

Python之迭代器和生成器

java中for循环和迭代器哪个效率高?

迭代器和生成器181030

Python中迭代器和生成器的区别与联系

迭代器和生成器的区别

Python迭代器和生成器