Itertor接口
看集合主要成员图(java集合中)可知Itertor接口不在图上,但是他也是集合框架的成员,但是它与Map集合系列,Collection集合系列不同,它主要装的是遍历Collection集合里的元素。Itertor对象也叫迭代器,依托Collection对象存在。提供遍历Collection的统一编程接口。
主要的方法:
boolean hasNext() 要是被遍历的集合还没遍历完,就返回true
Object next() 返回集合里的下一个元素
void remove() 删除上一次next()返回的元素
package Test01; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; public class Test { public static void main(String[] args) { Collection arr = new HashSet<>(); arr.add("a"); arr.add("b"); arr.add("C");//可以添加重复的对象 Iterator iterator =arr.iterator(); while(iterator.hasNext()) { String next = (String) iterator.next(); System.out.println(next); if(next.equals("C")) { iterator.remove(); } next ="修改迭代变量的值看看有没影响"; //注意下 } System.out.println(arr.toString()); } }
运行完发现“注意下”的地方本想改变集合里的元素却没变。所以可得到:Iterator并不是得到集合本身的元素,而是得到元素的值而已,所以修改迭代变量的值并不会影响集合本身。
Iterator不像其他集合,没有承装对象的能力。如果他不依托集合存在,根本没存在的价值。
想删除集合元素,必须通过Iterator的remove() 删除上一次next()返回的元素,不能集合自己remove(Object)
举例,会发现异常
package Test01; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; public class Test { public static void main(String[] args) { Collection arr = new HashSet<>(); arr.add("a"); arr.add("b"); arr.add("C");//可以添加重复的对象 Iterator iterator =arr.iterator(); while(iterator.hasNext()) { String next = (String) iterator.next(); System.out.println(next); if(next.equals("b")) { arr.remove(next); } next ="修改迭代变量的值看看有没影响"; } System.out.println(arr.toString()); } }
异常原因是 迭代器采用快速-失败原则(fast-fail),一旦迭代过程中发现Collection集合中元素被修改,就引发异常。偶尔发现,如果刚刚代码改成
if(next.equals("C")) { arr.remove(next); }
也不会异常,----只有删除特定元素才会这样,但是不该冒险去做。
foreach也能迭代访问集合,但是注意,他得到的也不是集合元素本身,系统只是把集合元素的值赋给迭代变量而已,也同样同上会引发Java ConcurrentModificationException异常。
如下代码(错误示范)
package Test01; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; public class Test { public static void main(String[] args) { Collection arr = new HashSet<>(); arr.add("a"); arr.add("b"); arr.add("C");//可以添加重复的对象 for(Object a:arr) { if(a.equals("b")) { arr.remove(a); } } } }