lazzyRabbit hello

开始学习下java集合类的源码

1337078642_5965.jpg

接口 Iterator

对集合进行迭代的迭代器。迭代器代替了 Java Collections Framework 中的 Enumeration。

迭代器与枚举有两点不同: 

  1. 迭代器允许调用方利用定义良好的语义在迭代期间从迭代器所指向的集合移除元素。
  2. 方法名称得到了改进。
public interface Iterator<e> {
  //如果仍有元素可以迭代,则返回 true。
  boolean hasNext();
  //返回迭代的下一个元素。
  E next();
  //从迭代器指向的集合中移除迭代器返回的最后一个元素(可选操作)。每次调用 next 
  //只能调用一次此方法。如果进行迭代时用调用此方法之外的其他方式修改了该迭代器所指向的集合,则迭代器的行为是不明确的。
  void remove();
}

迭代器是 故障快速修复(fail-fast)的。这意味着,当另一个线程修改底层集合的时候,如果您正在用 Iterator 遍历集合,那么,Iterator就会抛出 ConcurrentModificationException (另一种 RuntimeException异常)异常并立刻失败 。

接口 ListIterator

列表迭代器,允许程序员按任一方向遍历列表、迭代期间修改列表,并获得迭代器在列表中的当前位置。ListIterator 没有当前元素;它的光标位置 始终位于调用 previous() 所返回的元素和调用 next() 所返回的元素之间。在长度为 n 的列表中,有 n+1 个有效的索引值,从 0 到 n(包含)。 

public interface ListIterator<E> extends Iterator<E> {
  void hasPrevious()
  Object previous()
  //返回对 next 的后续调用所返回元素的索引。(如果列表迭代器在列表的结尾,则返回列表的大小)。 
  int nextIndex()
  //(如果列表迭代器在列表的开始,则返回 -1)。 
  int previousIndex()
  //将指定的元素插入列表(可选操作)。该元素直接插入到 next 返回的下一个元素的前面(如果有),或者 previous 返回的下一个元素之后(如果有)。
  void add(E)
  //替换最后一次调用next()或者previous()返回的元素。在调用本方法前,不可调用add(E)和remove()方法。
  void set(E)
  boolean hasNext();
  E next();
  void remove();
}

相较于Iterator,ListIterator允许我们向前、向后两个方向遍历 List;在遍历时修改 List 的元素;遍历时获取迭代器当前游标所在位置。