【发布时间】:2023-03-26 08:01:01
【问题描述】:
迭代器的关键属性之一是
迭代器模式允许我们:
- 访问集合的内容而不暴露其内部结构。
这究竟是什么意思,内部结构是什么?
【问题讨论】:
-
这意味着您可以在不知道它们如何到达那里、如何删除、如何存储等情况下浏览每个项目...
标签: java oop collections iterator
迭代器的关键属性之一是
迭代器模式允许我们:
- 访问集合的内容而不暴露其内部结构。
这究竟是什么意思,内部结构是什么?
【问题讨论】:
标签: java oop collections iterator
每个数据结构的实现方式都不同。一些结构可能使用链接设计,一些可能由单个数组支持,或者可能是两者的混合。想象一下,如果每次您想使用不同的 List 实现,您需要了解它的工作原理才能使用它。
Iterator 接口(连同其他接口)提供了一组一致的方法,允许您使用可迭代对象,即使您不知道它是如何“在后台”实现的。
【讨论】:
内部结构是保存集合内容的私有成员。
例如,在ArrayList 中,内部结构是一个支持数组,其中包含List 的元素:
transient Object[] elementData;
ArrayList 的iterator() 返回的Iterator 使您可以访问ArrayList 的元素,而无需访问支持数组,这意味着您不能直接改变支持数组。
对于HashSet,内部结构是一个HashMap,它包含Set的元素:
private transient HashMap<E,Object> map;
同样,迭代器允许您访问 Set 的元素,而无需访问 HashMap。
【讨论】:
在此上下文中,内部结构表示集合类或接口的成员函数列表。但进一步思考,由于成员函数列表大致构成类/接口,内部结构意味着集合的类/接口。而且这个说法很宽泛,可以表示数组、包、队列等集合......
迭代器是一种适配器,其接口通常与它所操作的集合不同。因此,使用迭代器不仅使我们能够隐藏集合的类声明(它定义了集合的内部结构),而且还使我们能够隐藏集合的公共接口(它可能是独立的并且比整个集合的类声明更小)。而且这个公共接口不是内部结构。所以你的原始陈述没有暴露其内部结构是可以的,但并不完全全面。
迭代器不仅使我们免于暴露内部结构,而且免于暴露集合的公共接口。这为代码分离上下文中的迭代器概念提供了更多价值。
【讨论】:
作为一个简单的例子,可以迭代 TreeMap 来学习地图的所有成员。使用迭代器时,我不必关心映射下的树是否是二叉树、trie、b-tree、红黑树等。作为用户,我不想知道它如何维护其内部链接以读取其数据。我不想知道它的实现。寻求可维护性的软件应该减少用户需要了解其实施的数量。
这种意义上的“结构”的使用方式与“数据结构”中的使用方式相同......一种在内存中组织数据以允许有效查找、插入、删除或其他操作的方式。迭代器通过调用next() 提供一种逐项获取数据的简单方法,隐藏了用于提高操作效率的组织方案的详细信息。
【讨论】: