迭代器 iterator
- 迭代器Iterator的作用?
集合Collection是一个容器,是用来存储数据的。Iterator不是容器,是用来遍历现存的集合中的数据的。
2.如何选取迭代器Iterator对象?
Iterator iterator = coll.iterator();
3.如何实现遍历(代码实现)
while (iterator.hasNext()) { System.out.println(iterator.next()); // next()的作用 //1. 指针下移 //2. 将下移以后集合位置上的元素返回 }
举例
package Collection;import org.junit.Test;import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;public class IteratorTest {@Testpublic void test1(){Collection coll = new ArrayList();coll.add("AA");coll.add(123);//自动装箱coll.add("haha");coll.add(new Object());coll.add(new Person("Tome",12));// coll.iterator();然后按Alt+enter// 会自动生成下面这样“Iterator iterator = coll.iterator();”Iterator iterator = coll.iterator();//System.out.println(iterator.getClass());如果好奇 可以查一下iterator class/**//迭代读取方式一:System.out.println(iterator.next());System.out.println(iterator.next());System.out.println(iterator.next());System.out.println(iterator.next());System.out.println(iterator.next());//当iterator迭代器遍历的元素个数超出了实际元素范围,会报错System.out.println(iterator.next());//迭代读取方式2:可以用,实际一般使用方式3比较多for (int i = 0; i < coll.size(); i++) {System.out.println(iterator.next());}*** *///迭代读取方式3:(常用)while (iterator.hasNext()) {System.out.println(iterator.next());}/**//常见的错误写法举例://已知Collection内部元素为:// AA;123;haha;【java.lang.Object@1ef7fe8e】;Person{name='Tome', age=12}//错误写法1://下面这个写法,先判断AA是不是null,然后指针下移,输出123//然后判断haha是不是null,再指针下移,输出Object 【java.lang.Object@1ef7fe8e】//然后再判断Person{name='Tome', age=12} 是不是 null,再指针下移,输出内容,发现找不到内容于是报错System.out.println("下面是错误的举例:");while ((iterator.next() != null)) {System.out.println(iterator.next());}
*//错误写法2://这种写法会错误的一直输出AA,原因是第一次触发语句coll.iterator().hasNext()// coll.iterator()就会新建一个迭代器,返回一个新的迭代器对象,它的指针在第一个元素AA的“楼顶”--AA的上面,// 之后遇见语句coll.iterator().next(),此时虽然指针已经下移,正指向AA元素,但是coll.iterator()语句直接又会新建一个迭代器// 那个新的迭代器又将指针拉回了AA的“楼顶”,此时coll.iterator().next()语句输出的就是AA元素// 错误的根本就是每次都新建一个迭代器,然后自动将指针放在第一个元素AA的“楼顶”while (coll.iterator().hasNext()) {System.out.println(coll.iterator().next());}
* */}
}
运行结果:
AA
123
haha
java.lang.Object@6f79caec
Person{name='Tome', age=12}Process finished with exit code 0
4.增强for循环(for each循环)的使用(jdk5.0新特性)
常见的循环有 for
常见的循环有 while
常见的循环有 do while
4.1 作用
用来遍历数组,集合。
4.2 格式
for(<要遍历的集合或数组元素的类型> <临时变量名>:<需要便利的集合或数组变量>){ 自定义的临时变量输出语句 }
具体应用举例:
package Collection;import org.junit.Test;import java.util.ArrayList;
import java.util.Collection;public class ForEachTest {@Testpublic void forEachtest(){Collection coll = new ArrayList();coll.add("AA");coll.add(123);//自动装箱coll.add("haha");coll.add(new Object());coll.add(new Person("Tome",12));//for each循环或增强for循环的用法//for(【集合中元素的类型】【输出元素临时变量名】:【遍历的容器名】)//工作原理是每次把coll中取一个元素赋给e,然后对e做{}内相应的处理for(Object e : coll){System.out.print(e+"\n");}}@Testpublic void forArraytest(){int [] arr =new int[] {1,2,3,4,5,6};for (int a : arr) {System.out.print(a+"\n");}}@Testpublic void forStringtest(){String [] arr = new String []{"aaa","bbb","ccc","ddd","eee"};for (String e : arr) {System.out.println(e);}}
}
运行结果:
aaa
bbb
ccc
ddd
eeeProcess finished with exit code 0
4.3 说明
针对集合来讲,增强for循环的底层其实调用的是 iterator 迭代器。
增强for循环的执行过程中,是将集合或数组中的元素依次赋值给临时变量,注意,循环体中对临时变量的修改可能不会导致原有集合或数组中元素的修改。
常见错误示例(比如下面这个举例,并不能将“MM“赋值给arr):
package Collection;import org.junit.Test;public class ForEachErrorTest {@Testpublic void testFor(){String [] arr = new String [] {"AA","BB","CC","DD"};// 赋值操作// 注意这里的s仅仅是临时变量,s存储着指向arr每一个元素的地址,// 当给s赋值时,临时变量s舍弃了原来存储的地址,存入了“MM”for (String s : arr) {s= "MM";}//遍历输出//注意这里的s仅仅是临时变量,s存储着指向arr每一个元素的地址,// 正因为s仅仅是临时变量 此时的s和刚才被赋值了“MM”的s并不是同一个s,刚才的s在上个for循环结束时候已经被释放了// 此时s仍指向arr中每一个元素的地址,System.out.println就会输出arr中每一个元素的值for (String s : arr) {System.out.println(s);}}
}
输出结果:
AA
BB
CC
DDProcess finished with exit code 0
下面这个例子,则使用传统的赋值方式,将“MM”赋值给了arr的每一个元素
package Collection;import org.junit.Test;public class ForEachErrorTest {@Testpublic void NormalForTest(){String [] arr = new String[]{"AA","BB","CC","DD"};for (int i = 0; i < arr.length; i++) {arr[i] = "MM";}for (String e : arr) {System.out.println(e);}}
}
运行结果:
MM
MM
MM
MMProcess finished with exit code 0