Iterator接口也是Java集合框架的成员,但它与Collection系列、Map系列的集合不一样: Collection系列集合、Map系列集合主要用于盛装其他对象,而Iterator 则主要用于遍历(即迭代访问) Collection集合中的元素,Iterator 对象也被称为迭代器。
Iterator接口隐藏了各种Collection实现类的底层细节,向应用程序提供了遍历Collection集合元素的统一编程接口。Iterator 接口里定义了如下4个方法。
➢boolean hasNext():如果被迭代的集合元素还没有被遍历完,则返回true。
➢Object next():返回集合里的下-一个元素。
➢void remove():删除集合里. 上一次next方法返回的元素。
➢void forEachRemaining(Consumer action),这是Java 8为Iterator 新增的默认方法,该方法可使用Lambda表达式来遍历集合元素。
下面程序示范了通过Iterator接口来遍历集合元素。
publicclassIteratorTest{
publicstaticvoidmain(String[]args){
Collectionbooks=newHashSet();
books.add("www");
books.add("nonelonely");
books.add("com");
//获取books集合对应的迭代器
Iteratorit=books.iterator();
while(it.hasNext()){
// it.next ()方法返回的数据类型是object类型,因此需要强制类型转换
Stringbook=(String)it.next();
System.out.println(book);
if(book.equals("nonelonely"))
//从集合中删除上一次next ()方法返回的元素
it.remove();
//对book变量赋值,不会改变集合元素本身
book="测试字符串";//①
}
System.out.println(books);
}
}
从上面代码中可以看出,Iterator 仅用于遍历集合,Iterator 本身并不提供盛装对象的能力。如果需
要创建Iterator对象,则必须有-一个被迭代的集合。没有集合的Iterator仿佛无本之木,没有存在的价值。
注意
Iterator必须依附于Collection 对象,若有一个Iterator 对象,则必然有一个与之关联的Collection对象。Iterator 提供了两个方法来迭代访问Collection 集合里的元素,并可通过remove()方法来删除集合中上一次 next()方法返回的集合元素。
上面程序中①行代码对迭代变量book进行赋值,但当再次输出books集合时,会看到集合里的元
素没有任何改变。这就可以得到一-个结论: 当使用Iterator对集合元素进行迭代时,Iterator 并不是把集合元素本身传给了迭代变量,而是把集合元素的值传给了迭代变量,所以修改迭代变量的值对集合元素本身没有任何影响。
当使用Iterator 迭代访问Collection 集合元素时,Collection 集合里的元素不能被改变,只有通过Iterator的remove()方法删除上一次next)方法返回的集合元素才可以:否则将会引发java.util.ConcurrentModificationException异常。