关于for丶foreach丶iterator 迭代器
1丶前言:我们在网上或者在讨论的时候往往会有这么一种说法:foreach 也是迭代器的一类,底层实现的是迭代器。但是这种说法并不严谨,也可以说这种说法对于我们正常的理解来说并不是能够完全理解。
2丶首先我来说出结论:for 丶 foreach 丶迭代器 这三个遍历方法中 不应该将他们三种遍历方法归在一起 而是将其分成三类)——不要将foreach 归为迭代器的一种遍历
(我们一步一步来,首先来简单介绍一下这是那种方法的区别)
3丶区别:
1)形式区别:
对于for循环,我们采用:
for(int i=0;i<arr.size();i++){…}
对于foreach:
for(int i:arr){…}
(在这里用int 类型举个例子)
对于迭代器的形式:
Iterator it = arr.iterator();
while(it.hasNext()){ object o =it.next(); …}
;
2)条件差别
for需要知道数组或者集合的大小,而且需要时有序的,不然无法遍历;
foreach和iterator不需要知道数组或者集合的大小,他们都是得到集合内的每一个元素然后进行处理;
3)多态差别
for和foreach都需要知道自己的集合类型,甚至要知道自己集合内的元素类型,不能实现多态。(
public static void main(String[] args) {
int[] ints = new int[]{1, 2, 3, 4};
int[] var2 = ints;
int var3 = ints.length;
for(int var4 = 0; var4 < var3; ++var4) {
int i = var2[var4];
System.out.println(i);
}
Collection coll = new ArrayList();
coll.add(123);
coll.add(456);
coll.add(789);
coll.add(new Person(1001, “Tom”));
Iterator var7 = coll.iterator();
while(var7.hasNext()) {
Object object = var7.next();
System.out.println(object);
}
}
这差不多是增强for的底层源码 我们可以清楚的看到 当我们遍历数组的时候他会用for循环俩遍历,放我们遍历结合的时候他会用迭代器来使用(你可能感到这与上面我所得出的结论相违背,下面的讲解我会说明)
)
Iterator是一个接口类型,它不关心集合的累心和集合内的元素类型,因为它是通过hasnext和next来进行下一个元素的判断和获取,这一切都是在集合类型定义的时候就完成的事情。迭代器统一了对容器的访问模式,这也是对接口解耦的最好表现。(lIterator对象称为迭代器(设计模式的一种),主要用于遍历 Collection 集合中的元素。
GOF给迭代器模式的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。迭代器模式,就是为容器而生。)
4)用法差别
for一般可以用于简单的顺序集合,并且可以预测集合的大小(一定要有序,因为i这个索引,所以遍历是一定要有序);
foreach可以遍历任何集合或者数组,但是使用者需要知道遍历元素的类型
iterator是最强大的,它可以随之修改元素内部的元素。可以在遍历的时刻用remove()
而且iterator不需要知道元素类型和元素大小,通过hasnext()判断是否遍历完所有元素。
而且在对范型的集合进行遍历的时候,iterator是唯一的选择,就是因为不需要知道元素类型便可以遍历。
4丶代码分析:
我们来看一下代码:
import java.util.*;
public class TreeSetTest {
public static void main(String[] args) {
List list=new ArrayList();
list.add("1");
list.add("2");
/*for(String temp : list){
if("1".equals(temp))
list.remove(