思维导图
思考题
1、迭代器的概念的是什么?
迭代器用于访问容器中的元素。
而访问容器中的元素面临两个难点:
1.不同的容器可能使用不同数据结构,而不同的数据结构导致访问容器元素方式的多变性。
2.针对容器的数据结构特点来访问容器中的元素会暴露容器的内部细节。
所以为了针对不同容器
1.提供统一的访问容器元素的方法
2.不暴露容器的内部细节
提出了迭代器模式。
2、Iterable接口和Iterator接口的概念,它们之间是否有联系?
Java中为迭代器模式设计了两个接口Iterable和Iterator。
其中Iterable规范了获取迭代器对象的方法定义:Iterator<E> iterator();
其中Iterator规范了迭代器访问和操作集合元素的方法定义:
boolean hasNext();
E next();
void remove();
在Java中,容器类一般需要先实现Iterable接口,即重写Iterator<E> iterator();方法,
而该方法的返回值需要一个Iterator对象。
我们知道Iterator是接口,所以Iterator对象只能是Iterator接口的实现类对象。
所以我们还需要定义一个Iterator接口的匿名内部类对象,
或者新定义一个Iterator的实现类,
在匿名内部类或实现类中重写hasNext(),next(),remove()等方法
3、迭代器和foreach的区别?
JDK5推出的foreach语法(即增强for循环)底层实现是使用迭代器遍历数组或集合的元素。
所以foreach和迭代器遍历数组或集合对象本质没有区别。
但是foreach的语法结构比迭代器更加简单明了。
另外迭代器在遍历集合元素过程中,
如果使用集合对象去remove集合元素,就会引发ConcurrentModificationException异常。
但是可以基于迭代器对象去remove集合元素,而不引发运行时异常ConcurrentModificationException。
foreach遍历过程中,无法调用底层的迭代器对象,所以也无法使用迭代器对象的remove操作。
而同样地,如果在foreach中使用集合对象去remove集合元素,则会引发ConcurrentModificationException。
4、普通for循环和迭代器的区别?
普通for可以遍历有索引地容器。
迭代器即可以遍历有索引的,也可以遍历无索引的容器。
普通for遍历有索引的容器,如数组,ArrayList集合时,采用的是根据索引随机访问机制。
迭代器遍历数组,ArrayList时,采用的时顺序访问集合元素,即只能一步一步的next()访问。
所以普通for遍历数组,ArrayList时要比迭代器,foreach快。
5、数组的遍历,我们是推荐使用普通for还是增强for?
如果单纯为了快一点点的话,可以使用普通for。
如果为了语法简单,则推荐使用foreach。
6、为什么迭代器不能脱离集合单独存在?
在Java中,定义迭代器离不开两个接口Iterable和Iterator。
集合类实现类Iterable接口,就需要在集合类中重写Iterable中的抽象方法Iterator<E> iterator();
而集合类中如果重写了Iterator<E> iterator();则该重写方法的方法体需要return一个Iterator实现类对象。
而Iterator实现类是为了访问集合元素而存在的,所以必须先有集合,才能有迭代器对象。否则定义不了迭代器对象。
综上所诉:
1.Java中迭代器对象的产生,只能是: 集合对象.iterator(); 所以没有集合对象,就无法创造迭代器对象。
2.迭代器的本质是访问集合元素。 如果没有集合,就没有集合的元素,那么迭代器就没有操作实体。