
迭代器为我们提供了统一的遍历容器的方式。
1、Iterator源码分析
public Iterator<E> iterator() {
return new Itr();
}
private class Itr implements Iterator<E> {
int cursor; // index of next element to return
int lastRet = -1; // index of last element returned; -1 if no such
public boolean hasNext() {
return cursor != size;
}
@SuppressWarnings("unchecked")
public E next() {
int i = cursor;
Object[] elementData = ArrayList.this.elementData;
cursor = i + 1;
return (E) elementData[lastRet = i];
}
public void remove() {
ArrayList.this.remove(lastRet);
cursor = lastRet;
lastRet = -1;
expectedModCount = modCount;
}
}
private class ListItr extends Itr implements ListIterator<E> {
ListItr(int index) {
super();
cursor = index;
}
public boolean hasPrevious() {
return cursor != 0;
}
public int nextIndex() {
return cursor;
}
public int previousIndex() {
return cursor - 1;
}
@SuppressWarnings("unchecked")
public E previous() {
int i = cursor - 1;
Object[] elementData = ArrayList.this.elementData;
cursor = i;
return (E) elementData[lastRet = i];
}
public void set(E e) {
}
public void add(E e) {
}
}
2、迭代器遍历List/Set集合
import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;
public class TestListItr {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
for (int i = 0; i < 5; i++) {
list.add("a" + i);
}
System.out.println(list);
for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
String temp = iterator.next();
System.out.print(temp + "t");
if(temp.endsWith("3")) {
iterator.remove();
}
}
System.out.println();
System.out.println(list);
// for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
// String temp = iterator.next();
// System.out.print(temp + "t");
// if(temp.endsWith("4")) {
// list.add("a5");//运行时异常ConcurrentModificationException并发修改异常
// }
// }
//ListIterator是Iterator接口的扩展,用于解决并发修改异常
for (ListIterator<String> iterator = list.listIterator(); iterator.hasNext();) {
String temp = iterator.next();
System.out.print(temp + "t");
if(temp.endsWith("4")) {
iterator.add("a5");
}
}
System.out.println();
System.out.println(list);
}
}
运行结果:

注意:
如果遇到遍历容器时,判断删除元素的情况,使用Iterator遍历;如果是判断添加修改元素的情况,使用ListIterator遍历。
3、迭代器遍历Map集合
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;
public class TestMapItr {
public static void main(String[] args) {
HashMap<String,Integer> map = new HashMap<String, Integer>();
map.put("hello", 123);
map.put("world", 456);
map.put("java", 789);
//方式一
Set<String> keySet = map.keySet();
for (Iterator<String> iterator = keySet.iterator(); iterator.hasNext();) {
String key = iterator.next();
System.out.print(key + "=" + map.get(key) + "t");
}
System.out.println();
//方式二 Entry<String, Integer>键值关系的类型
Set<Entry<String, Integer>> entrySet = map.entrySet();
for (Iterator<Entry<String, Integer>> iterator = entrySet.iterator(); iterator.hasNext();) {
Entry<String, Integer> entry = iterator.next();
System.out.print(entry.getKey() + "--" + entry.getValue() + "t");
}
System.out.println();
}
}
运行结果:

我们也可以通过map的keySet()、valueSet()获得key和value的集合,从而遍历它们。
尚学堂百战程序员
百战程序员_IT6000集_影响6000万学习IT的中国人【官网】