什么是不暴露内部结构&#39 ;? (迭代)

时间:2018-03-07 16:04:50

标签: java oop collections iterator

迭代器的一个关键属性是

  

迭代器模式允许我们:

     
      
  • 访问集合的内容而不暴露其内部结构。
  •   

究竟是什么意思,内部结构是什么?

4 个答案:

答案 0 :(得分:2)

每个数据结构的实现方式都不同。一些结构可能使用链接设计,一些可能由单个阵列支持,或者可能存在两者的混合。想象一下,如果您每次想要使用不同的List实现,您需要了解它是如何工作的才能使用它。

Iterator接口(以及其他接口)提供了一组一致的方法,允许您使用迭代,即使您不知道它是如何在“引擎盖下”实现的。

答案 1 :(得分:1)

内部结构是保存集合内容的私有成员[s]。

例如,在ArrayList中,内部结构是一个支持List的元素的后备数组:

transient Object[] elementData;

Iterator ArrayList返回的iterator()可让您访问ArrayList的元素而无需访问支持数组,这意味着您无法变异直接支持数组。

对于HashSet,内部结构是HashMap,其中包含Set的元素:

private transient HashMap<E,Object> map;

同样,迭代器使您可以访问Set的元素,而无法访问HashMap

答案 2 :(得分:1)

在此上下文中,内部结构表示集合类或接口的成员函数列表。但进一步思考,由于成员函数列表大致构成类/接口,内部结构表示集合的类/接口。这个陈述很宽泛,可能意味着像array,bag,queue ......这样的集合......

迭代器是一个适配器,通常具有与其操作的集合不同的接口。因此,使用迭代器不仅可以隐藏集合的类声明(定义集合的内部结构),还可以隐藏集合的公共接口(可能与整个集合的类声明分开且小于整个集合的类声明)。而这个公共接口不是内部结构。所以你的原始陈述没有暴露其内部结构是可以的,但并不完全全面。

迭代器不仅使我们免于暴露内部结构,而且还暴露了集合的公共接口。这在代码分离的上下文中为迭代器的概念提供了更多的价值。

答案 3 :(得分:1)

作为一个简单的例子,可以迭代TreeMap来学习地图的所有成员。当使用迭代器时,我不必关心地图底层的树是二叉树,特里树,b树,红黑树等。作为用户我不想要知道如何维护其内部链接以读取其数据。我不想知道它的实现。寻求可维护性的软件应该减少用户需要了解的实现量。

这种意义上的“结构”以与“数据结构”相同的方式使用......一种在存储器中组织数据以允许有效查找,插入,删除或其他操作的方式。迭代器隐藏了用于提高操作效率的组织方案的详细信息,方法是通过调用next()提供一种逐项获取数据的简单方法。