上一篇已经说过了Iterator迭代器的原理是使用内部类实现的,现在说说
迭代器的取值方式和对元素操作的注意事项:
1.迭代器的取值方式一般有两种:
public class IteratorDemo {
public static void main(String[] args)
{
Collection coll = new ArrayList();
coll.add("abc1");
coll.add("abc2");
coll.add("abc3");
coll.add("abc4");
Iterator it1 = coll.iterator();
// next方法自动往下取元素.
// 当取到了不存在的元素。NoSuchElementException
//取法一
while (it1.hasNext())
{
System.out.println(it1.next());
}
System.out.println(it1.hasNext()); //false 但it1还有
Collection coll2 = new ArrayList();
coll2.add("abc1");
coll2.add("abc2");
coll2.add("abc3");
coll2.add("abc4");
//常用的取法二
for (Iterator it = coll2.iterator(); it.hasNext(); ){
System.out.println (it.next()+"----------");
}
}
}
2.Iterator迭代器在取值时的请注意不要同时使用集合增加,修改元素:
/*
在迭代过程中,如果使用集合对象继续操作元素,有可能发生ConcurrentModificationException。
所以,需要做的是要么使用集合对象操作元素,
要么使用迭代器操作元素。不要同时使用。
在迭代过程中如果需要操作元素,可以使用迭代器的方法。
但是很遗憾,Iterator中只有对元素的判断,获取,删除操作,
这是就需要使用Iterator对象子接口来实现。就是 ListIterator.注意这个列表迭代器只有List集合具备。
ListIterator具备在迭代过程中对元素进行增删改查的动作。
*/
public class ListIteratorDemo {
public static void main(String[] args)
{
List<String> list = new ArrayList<String>();
list.add("abc1");
list.add("abc2");
list.add("abc3");
/* Iterator<String> it = list.iterator();
while(it.hasNext())
{
String str = (String)it.next();
System.out.println(str);
if(str.equals("abc2"))
list.add("abcxxx");//这里使用了迭代器和集合本身同时操作元素的错误,会报异常:ConcurrentModificationException
}*/
ListIterator<String> liIterator = list.listIterator();
while(liIterator.hasNext())
{
String str = (String)liIterator.next();
System.out.println("取值:"+str);
if(str.equals("abc2")){
liIterator.set("xxx");
}else if(str.equals("abc3")){
liIterator.add("yyy");
}else if(str.equals("abc1")){
liIterator.remove();
}
}
System.out.println("修改后的值:"+list);//[xxx, abc3, yyy]
while(liIterator.hasPrevious())//从下往上取值
{
System.out.println("修改后的从下往上取值:"+liIterator.previous());
}
}
}
ListIteratorDemo类中main方法执行后输出的值为:
取值:abc1
取值:abc2
取值:abc3
修改后的值:[xxx, abc3, yyy]
修改后的从下往上取值:yyy
修改后的从下往上取值:abc3
修改后的从下往上取值:xxx