Collection、Map主要用于盛装其他对象,而Iterator则主要用于遍历Collection集合中的元素,Iterator对象也被称为迭代器。
例如:
public class IteratorTest
{
public static void main(String args[])
{
Collection books=new HashSet();
books.add("轻量级Java EE企业应用实战");
books.add("疯狂Java讲义");
books.add("疯狂Android讲义");
Iterator it=books.iterator();
while(it.hasNext())
{
//it.next()方法返回的数据类型是Object类型
//需要强制类型转换
String book=(String)it.next();
System.out.println(book);
if(book.equals("疯狂Java讲义"))
{
//从集合中删除上一次next方法返回的与元素
it.remove();
}
//对book变量赋值,不会改变集合元素本身
book="测试字符串";//(1)
}
System.out.println(books);
}
}
运行结果:
轻量级Java EE企业应用实战
疯狂Android讲义
疯狂Java讲义
[轻量级Java EE企业应用实战, 疯狂Android讲义]
上面(1)对迭代变量book赋值,但当再次输出books集合时,我们看到集合里的元素没有任何改变。得出如下结论:当使用Iterator对集合元素进行迭代时,Iterator并不是把集合元素本身传给了迭代变量,而是把集合元素的值传给了迭代变量,所以修改迭代变量的值对集合元素本身没有任何影响。
注意:Iterator必须依附于Collection对象,若有一个Iterator对象,则必然有一个与之关联的Collection对象。Iterator提供了两个方法来迭代访问Collection集合里的元素,并可通过remove()方法删除集合中上一次next()方法返回的集合元素。
除了可以使用Iterator接口迭代访问Collection即合里的元素之外,Java5提供的foreach循环迭代访问集合元素更加便捷。
public class ForeachTest
{
public static void main(String args[])
{
Collection books=new HashSet();
books.add(new String("轻量级Java EE企业应用实战"));
books.add(new String("疯狂Java讲义"));
books.add(new String("疯狂Android讲义"));
for(Object obj:books)
{
String book=(String)obj;
System.out.println(book);
if(book.equals("疯狂Android讲义"))
{
//下面代码会引发ConcurrentModificationException异常
books.remove(book);
}
}
System.out.println(books);
}
}
上面代码使用foreach循环来迭代访问Collection集合里的元素更加简洁,这就是foreach循环带来的优势。与使用Iterator接口迭代访问集合元素类似地是,foreach循环中的迭代变量也不是集合元素本身,系统只是依次把集合元素的值赋给迭代变量,因此,在foreach循环中修改迭代变量的值也没有任何实际意义。