-
List
接口
先看下List
接口所提供的方法以及对比Collection
接口,有哪些是新增方法(红红框框着的是新增的方法):
从图中可以看出新增的方法是随机访问类、迭代等方法。
-
AbstractList
抽象实现类
抽象实现类继承了AbstractCollection
类,实现了List
接口
其中的方法也主要是使用Iterator
来处理的,当然由于是List
所以使用了ListIterator
看图:
在类的内部也实现了Itr
静态内部类提供给父接口Iteraotr
:
实现ListIterator
的接口(具体ListIterator
包含那些看看API,主要是提供*prev,*index,add*,set*
),那么现在我们来看下ListItr
实现类都干了些什么吧。
主要实现ListIterator<E>
的*prev,*index,add*,set*
这些方法,原理也是使用Iterator
。
-
ArrayList
实现类
ArrayList
的类图结构如下:
内部结构使用elementData和size实现:
Q:为什么ArrayList不可以遍历的时候使用list修改,比如:list.add list.remove。
A:一个 列表是固定的,删除一个那就会导致size不一致,取得的数据也不一样,这样肯定不合适。
Q:为什么使用iterator进行遍历的时候可以修改。
A:使用iterator的时候,遍历对象是iterator,他知道具体改动。不会导致取得的数据不一致,比如:add, remove的时候是当前游标。下次迭代是下一个元素。
Q:是什么原理证迭代的时候不可以使用list.add等方法
A:Itr类中保存了一个expectedModCount值记录期望修改次数,拿expectedModCount和modCount进行比对来确保,方法名叫:checkForComodification()