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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胥文 中级黑马   /  2013-2-20 17:21  /  1790 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 胥文 于 2013-2-20 19:27 编辑

public static void main(String[] args) {
  List c = new ArrayList();
  c.add("abc");
  c.add("abcd");
  c.add("abcde");
  c.add("abcdef");
  ListIterator li = c.listIterator();
  while(li.hasNext())
  {
   Object obj =li.next();
   if(obj.equals("abcd"))
   {
    li.add("123");
    //li.set("234");
    System.out.println(c);//字符串"123"已经加到集合里面去了,按照道理下一个应该是123啊,怎么么没有啊
    System.out.println(obj+"-------------");
   }
   System.out.println(obj);//这里为什么没有打印"123"啊(按照最后的结果这里是应该要打印的啊)
  }
  
}
打印结果是:
abc
[abc, abcd, 123, abcde, abcdef]
abcd-------------
abcd
abcde
abcdef

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
本帖最后由 黑马刘杰 于 2013-2-20 17:46 编辑
  1. public static void main(String[] args) {
  2.                 List<String> c = new ArrayList<String>();
  3.                 c.add("abc");
  4.                 c.add("abcd");
  5.                 c.add("abcde");
  6.                 c.add("abcdef");
  7.                 ListIterator<String> li = c.listIterator();
  8.                 while (li.hasNext()) {
  9.                         Object obj = li.next();
  10.                         if (obj.equals("abcd")) {
  11.                                 li.add("123");
  12.                                 // li.set("234");
  13.                                 System.out.println(c);// 字符串"123"已经加到集合里面去了,按照道理下一个应该是123啊,怎么么没有啊
  14.                                 System.out.println(obj + "-------------");
  15.                         }
  16.                         System.out.println(obj);// 这里的obj还是指向if前面的li.next,并没有赋新值。所以打印的是原集合中的元素。
  17.                         
  18.                 }
  19. //字符串“123”已经在集合c中了,你可以这样子取出字符串“123”
  20.                 for(Iterator<String> it=c.iterator();it.hasNext();){
  21.                         Object obj=it.next();
  22.                         if(obj.equals("123")){
  23.                                 System.out.println(obj);
  24.                         }
  25.                 }

  26.         }
复制代码
回复 使用道具 举报
我查了下API,是这样说的:
将指定的元素插入列表(可选操作)。该元素直接插入到 next 返回的下一个元素的前面(如果有),或者 previous 返回的下一个元素之后(如果有);如果列表没有元素,那么新元素就成为列表中的唯一元素。新元素被插入到隐式光标前:不影响对 next 的后续调用,并且对 previous 的后续调用会返回此新元素(此调用把调用 nextIndex 或 previousIndex 所返回的值增加 1)。
回复 使用道具 举报
同学,我来给你权威的解释,其实就是2楼的英文版。

你把鼠标放在add这个方法上面就可以看到。

请看图,请阅读这段英文,它的中文意思就是2楼所说
The new element is inserted before the implicit
     cursor: a subsequent call to {@code next} would be unaffected, and a
      subsequent call to {@code previous} would return the new element.

所以啊,提醒我们要学好英文,而且很多问题其实java文档中已经有答案了
回复 使用道具 举报
ListIterator迭代器,允许按任一方向遍历列表、迭代期间修改列表,并获得迭代器在列表中的当前位置。ListIterator 没有当前元素;它的光标位置 始终位于调用 previous() 所返回的元素和调用 next() 所返回的元素之间。长度为 n 的列表的迭代器有 n+1 个可能的指针位置, 所以就会出现这种情况
回复 使用道具 举报
本帖最后由 王钊 于 2013-2-20 18:15 编辑

首先看api关于ListIterator一段介绍:系列表迭代器,允许程序员按任一方向遍历列表、迭代期间修改列表,并获得迭代器在列表中的当前位置。ListIterator 没有当前元素;它的光标位置 始终位于调用 previous() 所返回的元素和调用 next() 所返回的元素之间。
由此可知迭代器在各个元素之间存在一个光标。
再看一段api,关于ListIterator中add()方法说明一段话:该元素直接插入到 next 返回的下一个元素的前面(如果有),或者 previous 返回的下一个元素之后(如果有);如果列表没有元素,那么新元素就成为列表中的唯一元素。新元素被插入到隐式光标前:不影响对 next 的后续调用,并且对 previous 的后续调用会返回此新元素。
也就是说,新元素确实加在了"abcd"和"abcde"之间,但是"abcd"和"abcde"之间还有光标别忘了,这个元素加在了光标之后,上图:
之后你再调用li.next()就会返回光标之后的元素,也就是说"123"被隔过去了。

无标题.png (18.57 KB, 下载次数: 45)

无标题.png

评分

参与人数 1技术分 +1 收起 理由
黄锦成 + 1

查看全部评分

回复 使用道具 举报
胥文 中级黑马 2013-2-20 19:26:33
7#
王钊 发表于 2013-2-20 18:12
首先看api关于ListIterator一段介绍:系列表迭代器,允许程序员按任一方向遍历列表、迭代期间修改列表,并 ...

谢谢了
说的很详细
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马