A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张旺达 高级黑马   /  2013-4-23 10:17  /  1371 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张旺达 于 2013-4-23 13:23 编辑
  1. import java.util.*;
  2. public class ListIteratorTest
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 String[] books = {"AAAAA","BBBBB"};

  7.                 List bookList = new ArrayList();

  8.                 for (int i=0; i<books.length; i++)
  9.                 {
  10.                         bookList.add(books[i]);
  11.                 }
  12.                
  13.                 ListIterator lit = bookList.listIterator();

  14.                 while(lit.hasNext())
  15.                 {
  16.                         System.out.println(lit.next());
  17.                         lit.add("-------分隔符-------");
  18.                 }

  19.                 System.out.println("=======下面开始反向迭代=======");

  20.                 while(lit.hasPrevious())
  21.                 {
  22.                         System.out.println(lit.previous());
  23.                 }
  24.         }
  25. }
复制代码
输出结果是:

AAAAA
BBBBB
=======下面开始反向迭代=======
--------分隔符--------
BBBBB
--------分隔符--------
AAAAA



请帮我读一下此程序,顺序有点看不明白啊。。。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

2 个回复

倒序浏览
本帖最后由 薛淑凯 于 2013-4-23 12:13 编辑

API文档关于ListIterator的add()方法的说明   
将指定的元素插入列表(可选操作)。该元素直接插入到 next 返回的下一个元素的前面(如果有),或者 previous 返回的下一个元素之后(如果有);
while(lit.hasNext())
                {
                 System.out.println(lit.next());
                 lit.add("-------分隔符-------");
                }
lit里是 AAAAA
          BBBBB
每次添加到next()返回元素前边   AAAAA
                                              -------分隔符-------
                                              BBBBB
                                              -------分隔符-------
反向打印也就是你的结果了

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
以前没有注意到这个细节,开始我还以为程序写错了,在这也学习了。说一下我的理解。
这个问题关键点在这
while(lit.hasNext())                                          //判断集合不为空
                {
                        System.out.println(lit.next());   //指针指向AAAAA,正向输出第一个元素AAAAA   ;  
                                                                        //第二次循环输出BBBBB
                        lit.add("-------分隔符-------");      //然后在当前指针位置向集合添加"-------分隔符-------",即AAAAA的后面   ;
                                                                        //第二次循环在BBBBB的后面添加"-------分隔符-------"
                }

     List的底层是用可变数组实现的,当用集合产生ListIterator迭代器遍历集合时,迭代器要遍历的对象就是当前集合,集合是用数组实现的,这个数组长度是固定的,即该集合是不会变的,可以认为处于锁定状态。虽然遍历过程中可以对数组进行增删改的操作,但这个集合就用另一个数组实现的,对于迭代器来说,下次遍历,要遍历的对象才是用这个新数组实现的集合。
     所以第一次遍历按原集合输出,第二次遍历输出修改后的集合元素,只不过是反序输出。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马