容器-Iterator迭代器(二十)
-
迭代器:就是为了实现List接口和Set接口的遍历有一个统一的规则。Collection接口继承了Iterator接口,在该接口中包含一个名为iterator的抽象方法,所有实现了Collection接口的实现类对该方法做了具体实现。iterator方法会返回一个Iterator接口类型的迭代器对象,在该对象中包含了三个方法用于实现对单例容器的迭代处理。
-
Iterator对象的工作原理:
-
迭代器的3个方法:
- boolean hasNext();//判断游标当前位置有没有元素,如果有返回true,否则返回false
- Object next(); // 获取当前游标所在位置的元素,并将游标移动到下一个位置
- void remove();//删除游标元素,在执行完next后该操作只能实行一次
-
使用Iterator迭代List接口类型容器
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class IteratorListTest { public static void main(String[] args) { //实例化容器 List<String> list=new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); //获取元素 //获取迭代器对象 Iterator<String> iterator=list.iterator();//帮助我们如何从容器获取元素,取多少次他是不负责的 /* //获取迭代器单个元素 boolean flag=iterator.hasNext();//判断当前有没有元素 if (flag){ String value=iterator.next();//获取元素,并向下一个位置移动指针 System.out.println(value); }*/ //方式一:在迭代器中,通过while循环获取元素 while (iterator.hasNext()){ String value=iterator.next(); System.out.println(value); } System.out.println("------------------------------"); //方式二:在迭代器中,通过for循环获取元素 for (Iterator<String> it=list.iterator();it.hasNext();){ String value=it.next(); System.out.println(value); } } }
-
使用Iterator迭代Set接口类型容器
public class IteratorSetTest { public static void main(String[] args) { //实例化Set类型的容器 Set<String> set= new HashSet<>(); set.add("a"); set.add("b"); set.add("c"); //方式一:通过while循环 //获取迭代器对象 Iterator<String> iterator=set.iterator(); while (iterator.hasNext()){ String value=iterator.next(); System.out.println(value); } System.out.println("----------------------------------"); //方式二:通过for循环 for (Iterator<String> it=set.iterator();it.hasNext();){ String value=it.next(); System.out.println(value); } } }
-
在迭代器中删除元素
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class IteratorRemoveTest { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); //方式五:用迭代器删元素(建议不要使用在这个方法),建议使用修正法,要删除元素,在循环外面删除 Iterator<String> iterator=list.iterator(); while (iterator.hasNext()){ //不要在一次循环中多次调用next方法 String value=iterator.next(); if ("c".equals(value)){ iterator.remove(); } } System.out.println("-----------------------------------"); for (Iterator<String> it=list.iterator();it.hasNext();){//因为迭代器是一次性的,所以这里要重新建立一个迭代器 System.out.println(it.next()); //list.add("dddd");for迭代也是不可以向容器当中添加元素的,因为还是会并发修改异常 } /*//方式四:用增强for循环删除元素 for (String str:list){ if ("c".equals(str)){ list.remove(str); } //list.add("dd");//ConcurrentModificationException,并发修改异常,不能在for-each循环添加元素, // 因为for-each也是在迭代器实现的 } for (String str:list){ System.out.println(str); }*/ /* //方式三:修正法 int flag = -1;//修正法 for (int i = 0; i < list.size(); i++) { if ("c".equals(list.get(i))) { flag = i; } } if (flag > -1) {//说明有元素 list.remove(flag); } for (String str : list) { System.out.println(str); }*/ /*//方式二:用if条件删除(是可以的) for (int i = 0; i < list.size(); i++) { /if ("c".equals(list.get(i))){//给个if判断条件,这样删除还是可以的,不会影响到删除d list.remove(2); } System.out.println(list.get(i)); }*/ /*//方式一:这样直接在for循环里直接remov是错误的 for (int i = 0; i < list.size(); i++) { /// list.remove(2);//这样删除元素是错误的,因为咋这个数组中,你索引为2的元素删除完之后, // 索引为3的元素会自动向前移一位,变成了索引为2的元素,而for循环这导致他又删除了索引为2的元素。 //所以只会剩下a、b //list.add("dddd");这样在for循环里面添加元素,只会导致死循环,因为你每次添加一次,就会使list.size()加一次,导致无限加了元素的个数,导致死循环 }*/ } }