迭代器模式:
把访问逻辑从不一样类型的集合类中抽取出来,从而避免向外部暴露集合的内部结构。java
Iterable接口:
foreach遍历集合的优点在于代码更加的简洁,更不容易出错,不用关心下标的起始值和终止值。
从本质上说,foreach其实就是在使用迭代器,在使用foreach遍历时对集合的结构进行修改,和在使用Iterator遍历时对集合结构进行修改本质上是同样的。一样会抛出异常,执行快速失败机制。数组
在使用Iterator的时候禁止对所遍历的容器进行改变其大小结构的操做。例如,在使用Iterator进行迭代时,若是对集合进行了add/remove操做就会出现ConcurrentModificationException异常。数据结构
RandomAccess
what is random and sequential access lists?
java集合类中元素的访问分为随机访问和顺序访问。
随机访问通常是经过index下标访问,行为相似数组的访问。而顺序访问相似于链表的访问,一般为迭代器遍历。dom
ArrayList是典型的随机访问型,而LinkedList则是顺序访问型。
List接口既定义了下标访问方法,又定义了迭代器方法。所以,其实例既可以使用下标随机访问也可使用迭代器进行遍历,但这两种方式的性能差别很明显。(下标访问比迭代器访问更快)性能
for循环与迭代器的对比:
一、ArrayList对随机访问比较快,而for循环中使用的get()方法,采用的便是 随机访问的方法,所以在ArrayList里for循环更快(foreach是一个内部循环体,多了其它的逻辑,虽然比for循环慢一些,但仍是一个量级的);
二、LinkedList则是顺序访问比较快,Iterator中的next()方法,采用的是 顺序访问方法,所以在LinkedList里只用Iterator更快。
主要仍是依据集合的数据结构不一样的判断。接口
ArrayList和LinkedList随机访问的区别
ArrayList是数组结构,随机访问具备常量时间。
LinkedList是链表结构,随机访问分为两步:
1)根据index查找Node,一般是一个for循环查找到index对应的Node
2)返回Node中存储的元素rem
ArrayList的下标遍历性能高于LinkedList的下标遍历。get