1. Java中Iterator用法整理 概念: 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。
Java中的Iterator功能比较简单,并且只能单向移动:
(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
(2) 使用next()获得序列中的下一个元素。
(3) 使用hasNext()检查序列中是否还有元素。
(4) 使用remove()将迭代器新返回的元素删除。
Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。 语法:
hasNext: 如果仍有元素可以迭代 则返回true 是Boolean类型next: 返回迭代的下一个元素remove(): 从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)代码:
package cn.xiaobing.util; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class IteratorDemo { public static void main(String[] args) { List<String> lst = new ArrayList<String>(); lst.add("aaa"); lst.add("bbb"); lst.add("ccc"); lst.add("ddd"); lst.add("eee"); lst.add("fff"); Iterator<String> iterator = lst.iterator(); //iterator.hasNext()如果存在元素的话返回true while(iterator.hasNext()) { //iterator.next()返回迭代的下一个元素 System.out.println(iterator.next()); } } }回归本题 一个ArrayList对象aList中存有若干个字符串元素,现欲遍历该ArrayList对象,删除其中所有值为"abc"的字符串元素,请用代码实现。
public class Test1 { public static void main(String[] args) { ArrayList<String> aList = new ArrayList<String>(); aList.add("a"); aList.add("ab"); aList.add("abc"); aList.add("abcr"); aList.add("abc"); aList.add("abcf"); aList.add("abc"); aList.add("abdc"); for(int i = 0;i < aList.size();i++){ if(aList.get(i).equals("abc")){ aList.remove(i); } } System.out.println(aList); } }输出结果为:[a, ab, abcr, abcf, abdc]. 也可以使用迭代器来遍历:
Iterator<String> iter = aList.iterator(); while(iter.hasNext()){ if(iter.next().equals("abc")){ iter.remove(); }结果与上面相同
修改数据增加一个"abc"
ArrayList<String> aList = new ArrayList<String>(); aList.add("a"); aList.add("ab"); aList.add("abc"); aList.add("abc"); //多加的一行 aList.add("abcr"); aList.add("abc"); aList.add("abcf"); aList.add("abc"); aList.add("abdc");用之前的for循环就会漏掉一个"abc" 而迭代器不会
原因: 检查后发现。在for循环里,当清除掉前一个“abc”后,索引会指向下一个“abc”,然而还做了i++操作,等于直接将这个“abc”跳了过去去执行后面的步骤,从而使它“逃过法网”。 而迭代器不会有这样的问题是因为hasNext()方法,原理是指针向后移动,每运行一次it.next(),指针向后移动一次,一个一个的遍历
总结: 使用两种遍历元素发现还是使用迭代器更好用