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(),指针向后移动一次,一个一个的遍历
总结:
使用两种遍历元素发现还是使用迭代器更好用