容器的可替换性
底层容器实现可以随意改变,而对用户的使用不产生影响,说白了,就是要统一接口,毕竟开发者只需要面向接口编程
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.此时将提交的数据的版本的数据与数据库对应记录的当前版本信息进行比对,如果提交数据版本号大于数据库表当前版本号则予以更新,否则,认为是过期数据