我们都知道ListIterator是List集合特有的迭代器,今天拿它做练习时,发现挺有意思,和大家分享下。。。
一、猜下下面程序的结果:- <p>import java.util.*;
- import static java.lang.System.*;</p><p>class ListIteratorDemo
- {
- public static void main(String[] args)
- {
- ArrayList<String> list=new ArrayList<String>();
- list.add("java01");
- list.add("java02");
- list.add("java03");</p><p> out.println("原集合list:"+list);
-
- for (ListIterator<String> it=list.listIterator();it.hasNext() ; )
- {
- it.add("add");
- out.println("添加了元素后的list:"+list);</p><p> it.set("set");
- out.println("改了元素后的list:"+list);</p><p> out.println(it.next());//打印下一个元素
- }
- }
- }
- </p><p> </p>
复制代码 结果是这样的:
出错啦!!!!
好吧这是我们没有看API的原因,不知道大家猜的结果是什么样滴。。。
看下API是怎么说的:
那现在改下顺序:- for (ListIterator<String> it=list.listIterator();it.hasNext() ; )
- {
- it.add("add");
- out.println("添加了元素后的list:"+list);
-
- out.println(it.next());//打印下一个元素
-
- it.set("set");
- out.println("改了元素后的list:"+list);
-
- break;//为了观看结果,一次over好了
- }
复制代码 结果:
二、好了改了之后我们的程序可以正常运行了,再来猜下下面程序的结果,也只是改了下顺序:- for (ListIterator<String> it=list.listIterator();it.hasNext() ; )
- {
-
- out.println(it.next());//打印下一个元素
-
- it.set("set");
- out.println("改了元素后的list:"+list);
- it.add("add");
- out.println("添加了元素后的list:"+list);
-
- break;//为了观看结果,一次over好了
- }
复制代码 结果:
在API中有这样对add描述的一段话:
将指定的元素插入列表(可选操作)。该元素直接插入到 next 返回的下一个元素的前面(如果有)。
在上一个程序时,我们把add放在第一的位置,也就是先于next执行的时候,元素是被添加到第一位,而add在next后执行,元素就被添加到了下一个元素前面。
把break注释掉,我们会看到这样的结果:
以上两例可以总结出:
1、set方法要放next方法之后才不会报错,如果next后跟了add(或者remove)再跟set就会报错;
2、set方法改变的是next方法返回的值,而不是第一位置的那个元素。
3、add方法添加的是next方法返回的下一个元素前面,而不是在第一元素位置前面添加。当没用调用next方法时,add方法添加的元素会被放在第一元素位置的前面。
三、想看个死循环么?- for (ListIterator<String> it=list.listIterator();it.hasNext() ; )
- {
- out.println(it.next());//打印下一个元素
- out.println(it.previous());//打印前一个元素
- }
复制代码 这样就可以了,有时候没事也可以用previous玩玩,和next的用法差不多。
一时兴起写了个资源共享,对大部分人来说都只是小孩子玩意,大家随便看看就好了,欢迎大家指正点评{:soso_e160:}
|