我所了解的Iterator设计模式

容器的可替换性


底层容器实现可以随意改变,而对用户的使用不产生影响,说白了,就是要统一接口,毕竟开发者只需要面向接口编程


Iterator设计思想


怎么给容器提供一种遍历方式?你可能会认为不就是个遍历吗?ArrayList用数组下标进行遍历,LinkedList也难怪指针next进行遍历。事实上,没那么简单。如果底层的容器实现变化了,用户的使用是不是也需要根据具体实现的数据结构来改变遍历方式呢?显然不行,不然何必统一接口。说到这里,你一定知道了Iterator就是一个统计遍历的接口


Iterator的几个角色


1.迭代器Iterator接口

2.迭代器Iterator的实现类,要求重写hasNext(),next(),remove()三个方法

3.容器统一接口,要求有一个返回Iterator接口的方法

4.容器实现类,实现一个返回Iterator接口的方法

ArrayList的Iterator实现同样重写了hasNext(),next(),remove()


modCount


迭代器Iterator允许在容器遍历的时候对元素进行删除,这样产生了一个问题,当多线程操作容器的时候,在用Iterator对容器遍历的同时,其他线程可能已经改变了该容器的内容(add,,remove等操作),所以每次对容器内容的更改操作(add,remove等)都会使modCount + 1,这样相当于乐观锁的版本号+1,当在Iterator遍历中remove时检查到modCount发生了变化,马上抛出ConcurrentModificationException,这就是java中容器中的“fail-fast”机制


乐观锁


一般是通过为数据库增加一个“version”字段。读取数据时连同版本号一同读出,之后更新时,对比版本号+1.此时将提交的数据的版本的数据与数据库对应记录的当前版本信息进行比对,如果提交数据版本号大于数据库表当前版本号则予以更新,否则,认为是过期数据

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 场景问题# 1.1 工资表数据的整合## 考虑这样一个实际应用:整合工资表数据。 这个项目的背景是这样的,项目...
    七寸知架构阅读 2,586评论 0 53
  • 之前在西安读书的时候是穷学生一枚,没怎么打过车,而且西安也不怎么大,即使打车也很快就到了,所以也没怎么和出租车...
    绿萝文竹阅读 237评论 0 0
  • 短短一周的见习结束了,但给我留下深刻印象的不仅仅是这群天真烂漫的小可爱们,更是这个小小学校特别的教育模式。 一...
    江畔暮雨077阅读 154评论 0 0
  • 昨天晚上,在“刘铁芳人文教育团队”微信群里,被踢。 这是2017年,在微信群里第三次挨踢。年终岁尾,借此回顾总结一...
    高手如林阅读 3,060评论 6 6
  • 2017.11.9 这学期已过半,回首看来,竟没有与学生发生一点“冲突”,是无形中“化干戈为玉帛”,还是学生知道认...
    zhouwq464阅读 210评论 0 0