Collection的遍历方式
- 遍历器遍历
- 增强for循环遍历
- Lambda表达式遍历
- 普通for只有List系列的才能用,Set用不了
一、迭代器遍历
-
iterator n.迭代器,迭代程序。
-
迭代器不依赖索引。
-
迭代器遍历就是把元素一个一个的获取出来
二、迭代器的Iterator类,和它的常用方法
-
迭代器在java中的类是Iterator,迭代器是集合专用的遍历方式。
-
Collection集合获取迭代器:
方法名称 说明 Iterator iterator() 返回迭代器默认对象,默认指向当前集合的0索引 迭代器常用方法:
方法名称 说明 boolean hasNext() 判断当前位置是否有元素,有元素返回true,没有元素返回false E next() 获取当前位置的元素,并将迭代器对象移向下一个位置。 -
迭代器对象我们可以给它看作“光标,指针,箭头”,都无所谓。
Iterator<String> it = list.iterator();
:创建指针,获取迭代器,默认指向集合的0索引boolean flag = it.hasNext();
:判断当前位置是否有元素。String str = it.next();
:获取当前指向的元素,移动指针。Sysout.out.println(str);
-
获取所用元素,可以利用循环:
Iterator<String> it = list.iterator(); while(it.hasNext()){ String str = it.next(); System.out.println(str); }
案例:
package com.mycollection; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; public class A03_CollectionDemo3 { /* Collection的遍历方式 遍历器遍历 增强for循环遍历 Lambda表达式遍历 普通for只有List系列的才能用,Set用不了 迭代器遍历的三个方法: Iterator<String> it = list.iterator();:创建指针,获取迭代器,默认指向集合的0索引 boolean flag = it.hasNext();:判断当前位置是否有元素。 String str = it.next();:获取当前指向的元素并移动指针。 */ public static void main(String[] args) { //1.创建集合并添加元素 Collection<String> coll = new ArrayList<>(); coll.add("aaa"); coll.add("bbb"); coll.add("ccc"); coll.add("ddd"); //2.获取迭代器对象 //迭代器就好比一个箭头,默认指向集合的0索引处。 Iterator<String> it = coll.iterator(); //3.利用循环不断的去获取集合中的每一个元素 while(it.hasNext()){ String str = it.next(); System.out.println(str); } } }
三、注意细节点
- 报错:NoSuchElementException :没有这个元素,异常
- 迭代器遍历完毕,指针不会复位,要想再次遍历,只能重新获取一次新的迭代器的对象。
- 循环中只能用一次next方法,不能用多次。
- 迭代器遍历时,不能用集合的方法进行增加或者删除
案例:
package com.mycollection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class A04_CollectionDemo4 {
/*
1. 报错:NoSuchElementException :没有这个元素,异常
2. 迭代器遍历完毕,指针不会复位,要想再次遍历,只能重新获取一次新的迭代器的对象。
3. 循环中只能用一次next方法,不能用多次。
4. 迭代器遍历时,不能用集合的方法进行增加或者删除
*/
public static void main(String[] args) {
//1.创建集合并添加元素
Collection<String> coll = new ArrayList<>();
coll.add("aaa");
coll.add("bbb");
coll.add("ccc");
coll.add("ddd");
//2.获取迭代器对象
//迭代器就好比一个箭头,默认指向集合的0索引处。
Iterator<String> it = coll.iterator();
//3.利用循环不断的去获取集合中的每一个元素
while(it.hasNext()){
String str = it.next();
System.out.println(str);
}
//当上面循环结束了之后,迭代器的指针已经指向了最后没有元素的位置。
//System.out.println(it.next()); //会报错:NoSuchElementException
//迭代器遍历完毕,指针不会复位。
System.out.println(it.hasNext());//false
//System.out.println(it.hasNext());//false
//System.out.println(it.hasNext());//false
//如果说要继续第二次遍历集合,只能再次获取一个新的迭代器对象。
Iterator<String> it2 = coll.iterator(); //跟上面是两个互相独立的迭代器对象。
while(it2.hasNext()){
String str = it2.next();
System.out.println(str);
}
}
}
运行结果:
-
next(),可以移动指针,用第一次移动了一个指针,用多次移动了多次指针,所以hasNext()和next是配套的,否则可能会报:NoSuchElementException。
案例:
package com.mycollection; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; public class A05_CollectionDemo5 { /* 1. 报错:NoSuchElementException :没有这个元素,异常 2. 迭代器遍历完毕,指针不会复位,要想再次遍历,只能重新获取一次新的迭代器的对象。 3. 循环中只能用一次next方法,不能用多次。 4. 迭代器遍历时,不能用集合的方法进行增加或者删除 */ public static void main(String[] args) { //1.创建集合并添加元素 Collection<String> coll = new ArrayList<>(); coll.add("aaa"); coll.add("bbb"); coll.add("ccc"); coll.add("ddd"); coll.add("eee"); //2.获取迭代器对象 //迭代器就好比一个箭头,默认指向集合的0索引处。 Iterator<String> it = coll.iterator(); //3.利用循环不断的去获取集合中的每一个元素 while(it.hasNext()){ //4.next方法的两件事情:获取元素并移动指针。 System.out.println(it.next()); System.out.println(it.next()); } } }
运行结果:
-
迭代器遍历时,不能用集合的方法进行增加或者删除
- 这个暂时当一个结论先行记忆
- 如果我实在要删除:那么可以用迭代器提供的remove方法进行删除。
- 如果要添加,暂时没有办法。
案例:
package com.mycollection; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; public class A05_CollectionDemo5 { /* 1. 报错:NoSuchElementException :没有这个元素,异常 2. 迭代器遍历完毕,指针不会复位,要想再次遍历,只能重新获取一次新的迭代器的对象。 3. 循环中只能用一次next方法,不能用多次。 4. 迭代器遍历时,不能用集合的方法进行增加或者删除 */ public static void main(String[] args) { //1.创建集合并添加元素 Collection<String> coll = new ArrayList<>(); coll.add("aaa"); coll.add("bbb"); coll.add("ccc"); coll.add("ddd"); coll.add("eee"); //2.获取迭代器对象 //迭代器就好比一个箭头,默认指向集合的0索引处。 Iterator<String> it = coll.iterator(); //3.利用循环不断的去获取集合中的每一个元素 while(it.hasNext()){ String str = it.next(); if("bbb".equals(str)){ coll.remove("bbb"); } System.out.println(str); } } }
运行结果:ConcurrentModificationException :并发修改异常
- 不能用集合中的方法删除,但是可以用迭代器中的方法删除。
package com.mycollection; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; public class A05_CollectionDemo5 { /* 1. 报错:NoSuchElementException :没有这个元素,异常 2. 迭代器遍历完毕,指针不会复位,要想再次遍历,只能重新获取一次新的迭代器的对象。 3. 循环中只能用一次next方法,不能用多次。 4. 迭代器遍历时,不能用集合的方法进行增加或者删除 */ public static void main(String[] args) { //1.创建集合并添加元素 Collection<String> coll = new ArrayList<>(); coll.add("aaa"); coll.add("bbb"); coll.add("ccc"); coll.add("ddd"); coll.add("eee"); //2.获取迭代器对象 //迭代器就好比一个箭头,默认指向集合的0索引处。 Iterator<String> it = coll.iterator(); //3.利用循环不断的去获取集合中的每一个元素 while(it.hasNext()){ //4.next方法的两件事情:获取元素并移动指针。 //System.out.println(it.next()); String str = it.next(); if("bbb".equals(str)){ //coll.remove("bbb"); //不能用集合中的方法删除,但是可以用迭代器中的方法删除。 it.remove(); } } System.out.println(coll); } }
运行结果:
四、总结
-
迭代器在遍历集合的时候是不依赖索引的。
-
迭代器需要掌握三个方法:
Iterator<String> it = list.iterator(); while(it.hasNext()){ String str = it.next(); System.out.println(str); }
-
迭代器的四个细节:
- 如果当前位置没有元素,还要强行获取,会包NoSuchElementException
- 迭代器遍历完毕,指针不会复位。
- 循环中只能用一次next方法。
- 迭代器遍历是,不用集合的方法对集合本身进行增加或者删除,但是遍历之后可以。