问题描述

如何实现一个支持“快照”功能的迭代器模式?

理解这个问题最关键的是理解“快照”两个字。所谓“快照”,指我们为容器创建迭代器的时候,相当于给容器拍了一张快照(Snapshot)。之后即便我们增删容器中的元素,快照中的元素并不会做相应的改动。而迭代器遍历的对象是快照而非容器,这样就避免了在使用迭代器遍历的过程中,增删容器中的元素,导致的不可预期的结果或者报错。

解决方案一

创建迭代器时创建容器的副本.

解决方案二

利用时间戳:

  • 容器中的每个元素需要记录其 add/delete 时间戳
  • 记录迭代器被创建时的时间戳, snapshot
  • 满足 add<snapshot<delete 的元素属于该迭代器

让容器既支持快照遍历,又支持随机访问?

我们可以在 ArrayList 中存储两个数组。一个支持标记删除的,用来实现快照遍历功能;一个不支持标记删除的(也就是将要删除的数据直接从数组中移除),用来支持随机访问。