您如何向刚刚开始使用Java编程的人解释,ArrayLists和Iterators之间的区别是什么?
为什么我会使用迭代器而不是使用Arraylist的get()方法
答案 0 :(得分:5)
ArrayList是一个实际的数据结构,是List接口的一个实现。 Iterator只是一个允许您浏览任何数据结构的接口(只要Iterator可用于该数据结构)。
换句话说,ArrayList是物理存储在数组中的对象引用(或基元)的实际列表。 ArrayList是List接口的“实现”,这意味着它提供了适用于List的所有方法的实现,例如add(object),remove(object),get(index)等。
迭代器是一种更通用的方式来浏览任何数据结构,无论是Set,List,等等。重要的一点是,它允许您浏览数据结构中的每个元素一次,然后就完成了。从文档中可以看出Iterator规定了两个方法,next()和hasNext()。 next返回底层数据结构中的下一个元素,hasNext让您知道底层数据结构中是否还有下一个元素。包含ArrayList的几个数据结构可以为您提供迭代器。
为什么我会使用迭代器而不是使用Arraylist的get()方法?
好吧,就像许多接口一样,Iterator允许你做同样的事情,无论底层实现是什么。如果我想“迭代”一些数据结构,我可以
a)编写专门针对数据结构的代码(例如ArrayList),如果我将数据结构更改为其他内容(例如HashSet)或
,我将不得不稍后更改b)从数据结构中获取Iterator,并使用相同的hasNext / next技术,即使我将数据结构更改为其他内容也能正常工作。
仅供参考,如果您对“界面”和“实施”一词不太熟悉,您可能应该在“Java界面”上进行谷歌搜索。
答案 1 :(得分:3)
ArrayList是一种特殊的List。它是data structure,就像树,地图或列表一样。
Iterator是用于遍历数据结构的design pattern的示例。您不像二叉树那样导航列表,但Iterator提供了一个描述所有数据结构导航器通用内容的接口。
因此,您可以使用Iterator遍历ArrayList。他们不是一回事。一个是导航员,另一个是容器。
那么为什么你更喜欢Iterator而不是只使用ArrayList的get()方法?
并非所有集合都有get()方法(例如,Collection and Set和binary tree)。如果需要从ArrayList切换到其中一个数据结构,则必须重写所有调用get()的代码。
但是如果你返回一个迭代器,代码的客户端就不必知道你已经改变了实现。
如果使用get(),则使用提供给您的实现。如果使用Iterator接口,则可以交换实现来执行智能代理等操作,而不会影响客户端。
这是关于隐藏有关班级客户导航的详细信息。如果您只使用ArrayList,那可能并不重要。但是如果您正在设计自己的类,您可能会发现Iterator为您提供了一种很好的方式来公开行为而不会泄露私人细节。
答案 2 :(得分:2)
回顾Sun的this教程,了解如何在实现Collection接口的类上使用Iterators(当然包括ArrayList)。
这可以为您提供一些关于如何使用它们的快速动手实例,这可能有助于可视化它们的差异。