for循环和迭代器Iterator

迭代器模式:
把访问逻辑从不同类型的集合类中抽取出来,从而避免向外部暴露集合的内部结构。

Iterable接口:
foreach遍历集合的优势在于代码更加的简洁,更不容易出错,不用关心下标的起始值和终止值。
从本质上说,foreach其实就是在使用迭代器,在使用foreach遍历时对集合的结构进行修改,和在使用Iterator遍历时对集合结构进行修改本质上是一样的。同样会抛出异常,执行快速失败机制。

在使用Iterator的时候禁止对所遍历的容器进行改变其大小结构的操作。例如,在使用Iterator进行迭代时,如果对集合进行了add/remove操作就会出现ConcurrentModificationException异常。

RandomAccess
what is random and sequential access lists?
java集合类中元素的访问分为随机访问和顺序访问。
随机访问一般是通过index下标访问,行为类似数组的访问。而顺序访问类似于链表的访问,通常为迭代器遍历。

ArrayList是典型的随机访问型,而LinkedList则是顺序访问型。
List接口既定义了下标访问方法,又定义了迭代器方法。因此,其实例既可使用下标随机访问也可以使用迭代器进行遍历,但这两种方式的性能差异很明显。(下标访问比迭代器访问更快)

for循环与迭代器的对比:
1、ArrayList对随机访问比较快,而for循环中使用的get()方法,采用的即是 随机访问的方法,因此在ArrayList里for循环更快(foreach是一个内部循环体,多了其它的逻辑,虽然比for循环慢一些,但还是一个量级的);
2、LinkedList则是顺序访问比较快,Iterator中的next()方法,采用的是 顺序访问方法,因此在LinkedList里只用Iterator更快。
主要还是依据集合的数据结构不同的判断。

ArrayList和LinkedList随机访问的区别
ArrayList是数组结构,随机访问具有常量时间。
LinkedList是链表结构,随机访问分为两步:
1)根据index查找Node,通常是一个for循环查找到index对应的Node
2)返回Node中存储的元素

ArrayList的下标遍历性能高于LinkedList的下标遍历。

猜你喜欢

转载自www.cnblogs.com/barbarian/p/9288509.html