-
List接口
先看下List接口所提供的方法以及对比Collection接口,有哪些是新增方法(红红框框着的是新增的方法):

List接口
从图中可以看出新增的方法是随机访问类、迭代等方法。
-
AbstractList抽象实现类
抽象实现类继承了AbstractCollection类,实现了List接口

AbstractList Head
其中的方法也主要是使用Iterator来处理的,当然由于是List所以使用了ListIterator
看图:

ListIterator使用
在类的内部也实现了Itr静态内部类提供给父接口Iteraotr:

Itr
实现ListIterator的接口(具体ListIterator包含那些看看API,主要是提供*prev,*index,add*,set*),那么现在我们来看下ListItr实现类都干了些什么吧。

ListItr.png
主要实现ListIterator<E>的*prev,*index,add*,set*这些方法,原理也是使用Iterator。
-
ArrayList实现类
ArrayList的类图结构如下:

ArrayList head.png
内部结构使用elementData和size实现:

Paste_Image.png
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()