for循环和迭代器Iterator
Posted barbarian
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的下标遍历。
以上是关于for循环和迭代器Iterator的主要内容,如果未能解决你的问题,请参考以下文章
ES6 - 基础学习(13): Iterator(迭代器) 和 for...of 循环