Iterator迭代器
程序员文章站
2022-07-12 11:54:07
...
上一篇已经说过了Iterator迭代器的原理是使用内部类实现的,现在说说
迭代器的取值方式和对元素操作的注意事项:
1.迭代器的取值方式一般有两种:
public class IteratorDemo { public static void main(String[] args) { Collection coll = new ArrayList(); coll.add("abc1"); coll.add("abc2"); coll.add("abc3"); coll.add("abc4"); Iterator it1 = coll.iterator(); // next方法自动往下取元素. // 当取到了不存在的元素。NoSuchElementException //取法一 while (it1.hasNext()) { System.out.println(it1.next()); } System.out.println(it1.hasNext()); //false 但it1还有 Collection coll2 = new ArrayList(); coll2.add("abc1"); coll2.add("abc2"); coll2.add("abc3"); coll2.add("abc4"); //常用的取法二 for (Iterator it = coll2.iterator(); it.hasNext(); ){ System.out.println (it.next()+"----------"); } } }
2.Iterator迭代器在取值时的请注意不要同时使用集合增加,修改元素:
/* 在迭代过程中,如果使用集合对象继续操作元素,有可能发生ConcurrentModificationException。 所以,需要做的是要么使用集合对象操作元素, 要么使用迭代器操作元素。不要同时使用。 在迭代过程中如果需要操作元素,可以使用迭代器的方法。 但是很遗憾,Iterator中只有对元素的判断,获取,删除操作, 这是就需要使用Iterator对象子接口来实现。就是 ListIterator.注意这个列表迭代器只有List集合具备。 ListIterator具备在迭代过程中对元素进行增删改查的动作。 */ public class ListIteratorDemo { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("abc1"); list.add("abc2"); list.add("abc3"); Iterator<String> it = list.iterator(); ListIterator<String> liIterator = list.listIterator(); /* while(it.hasNext()) { String str = (String)it.next(); System.out.println(str); if(str.equals("abc2")) list.add("abcxxx");//这里使用了迭代器和集合本身同时操作元素的错误,会报异常:ConcurrentModificationException }*/ while(liIterator.hasNext()) { String str = (String)liIterator.next(); System.out.println("取值:"+str); if(str.equals("abc2")){ liIterator.set("xxx"); }else if(str.equals("abc3")){ liIterator.add("yyy"); }else if(str.equals("abc1")){ liIterator.remove(); } } System.out.println("修改后的值:"+list);//[xxx, abc3, yyy] while(liIterator.hasPrevious())//从下往上取值 { System.out.println("修改后的从下往上取值:"+liIterator.previous()); } } }
ListIteratorDemo类中main方法执行后输出的值为:
取值:abc1
取值:abc2
取值:abc3
修改后的值:[xxx, abc3, yyy]
修改后的从下往上取值:yyy
修改后的从下往上取值:abc3
修改后的从下往上取值:xxx