遍历不同容器的元素,如果为每个容器都设计一套遍历方法,会很麻烦。迭代器Iterator提供了这样的便利,它可以遍历并且得到容器中的对象,而不必关心容器的具体类型。
Java的Iterator只能单向移动。
Iterator由实现了Iterable接口的类的iterator()方法 返回,初始时指向第一个元素前的位置。next()向后移动时指向2个元素之间的位置。remove()方法删除next()方法返回的元素。如果没有更多元素,remove和next会抛出异常,所以在进行遍历前要用hasNext方法判断是否包含下个元素。
任何实现Iterable接口的类,既可以使用迭代器,也可以使用foreach循环遍历元素
public static void main(String[] args) {
Set<String> set = new HashSet<String>();
set.add("abc");
set.add("def");
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
for (String s : set) {
System.out.println(s);
}
}
可以自己实现Iterator接口以使用foreach循环
public class Test implements Iterable<String>{
private ArrayList<String> words;
public static void main(String[] args) {
Test t = new Test();
t.insert("abc");
t.insert("def");
for (String s : t) {
System.out.println(s);
}
}
public Test() {
words = new ArrayList<String>();
}
public void insert(String word) {
words.add(word);
}
@Override
public Iterator<String> iterator() {
return new Iterator<String>() {
private int index = 0;
@Override
public boolean hasNext() {
return index < words.size();
}
@Override
public String next() {
return words.get(index++);
}
@Override
public void remove() {
words.remove(index);
}
};
}
}