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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© shuren2015 中级黑马   /  2015-2-27 13:05  /  929 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

学完ListIterator,就产生了有没有可能发生死循环的可能,我开始试验。这是我认为会死循环的代码
  1. package com.itheima;
  2. import java.util.*;
  3. public class ListIteratorDemo {

  4.         public static void main(String[] args) {
  5.                 // TODO Auto-generated method stub
  6.                 ArrayList<String> al=new ArrayList<String>();
  7.                 al.add("lisi01");
  8.                 al.add("lisi02");
  9.                 al.add("lisi03");
  10.                 al.add("lisi04");
  11.                 list(al);
  12.         }
  13.         public static void list(ArrayList<String> al){
  14.                 sop(al);
  15.                 for(ListIterator<String> lt=al.listIterator(0);lt.hasNext();){
  16.                         String obj=lt.next();
  17.                         sop(obj);                                //在这里加上输出语句,如果添加的新元素会出现在这里,一定会是死循环
  18.                         if(obj=="lisi02")               
  19.                                 lt.add("lisi02");
  20.                 }
  21.                 sop(al);
  22.         }
  23.         public static void sop(Object o)
  24.         {
  25.                 System.out.println(o);
  26.         }

  27. }
复制代码
输出结果是

发现添加新元素后,果然迭加器会跳过该元素,这样就消除了我的顾虑,
但是我还不放心,又改了,核心代码
  1. for(ListIterator<String> lt=al.listIterator(al.size());lt.hasPrevious();){
  2.                         String obj=lt.previous();
  3.                         sop(obj);                                //在这里加上输出语句,如果添加的新元素会出现在这里,一定会是死循环
  4.                         if(obj=="lisi02")               
  5.                                 lt.add("lisi02");
  6.                 }
复制代码
结果奇迹发生了

把检索方式反一下,照理应该和next()是一样的处理方式,结果真出现死循环了。
我想求解:这是jdk编写者的遗漏还是另有原因。





2 个回复

倒序浏览
ListIterator接口中几个方法的工作原理,API文档写得很清楚了。add()方法添加元素会导致:a subsequent call to previous would return the new element. 死循环是非常正常的了。

如果再看源码就会知道,你认为“把检索方式反一下,照理应该和next()是一样的处理方式”是错误的。ListIterator几个方法的实现依赖于List中元素的下标。add新元素,下标都+1,但next和previous的方向不同就会带来不同的结果

这个算不上失误。就像死循环不能说是循环语句的设计失误,只是人为利用了其工作原理造出来死循环这个现象(有意或无意)

评分

参与人数 1技术分 +1 收起 理由
万合天宜 + 1 很给力!

查看全部评分

回复 使用道具 举报
a subsequent call to previous would return the new element.
看到这句,足矣!
谢谢您的耐心解答
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马