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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马杨晨 中级黑马   /  2012-9-19 13:30  /  1482 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马杨晨 于 2012-9-23 14:03 编辑

import java.util.*;
class ListDemo
{
public static void main(String[] args)
{
  //演示列表迭代器。
  ArrayList al = new ArrayList();
  
  //添加元素
  al.add("java01");
  al.add("java02");
  al.add("java03");
  
  //在迭代过程中,准备添加或者删除元素。
  Iterator it = al.iterator();
  
  while(it.hasNext())
  {
   Object obj = it.next();
   
   if(obj.equals("java02"))
   {
    al.remove("java01"); //移除元素,这句好像有问题?
   // al.add("java008");
   }
   
   System.out.println("obj="+obj);
  }
}
}
红色代码不对吗?
结果为什么是这样呢?



5 个回复

倒序浏览
很简单,
// 在迭代过程中,准备添加或者删除元素。
                        Iterator it = al.iterator();

                        while (it.hasNext()) {
                                Object obj = it.next();
                                if (obj.equals("java02")) {
                                        al.remove("java01"); // 移除元素,这句好像有问题?
                                        //al.add("add");
                                }
                                System.out.println("obj=" + obj);
                        }
一开始,al里面有3个对象,
while循环打印了第一个对象java01,也就是obj=java01
当到第二个对象java02的时候移除了java01,然后打印了第二个对象java02,也就是obj=java02,这时候al里面就只有2个对象了,所以while(id.hasNext())就不往下执行了,
最后就只打印出了
obj=java01
obj=java02
回复 使用道具 举报
import java.util.*;
class ListDemo
{
public static void main(String[] args)
{
  //演示列表迭代器。
  ArrayList al = new ArrayList();

  //添加元素
  al.add("java01");
  al.add("java02");
  al.add("java03");

  //在迭代过程中,准备添加或者删除元素。
  Iterator it = al.iterator();

  while(it.hasNext())
  {
  Object obj = it.next();
   it.remove();// 从迭代器指向的collection中移除迭代器返回的最后一个元素
    sop(al);

  }
}
public static void sop(Object obj)
{
        System.out.println("obj="+obj);
}
}
//运行一下吧


回复 使用道具 举报
ArrayList的迭代器是不支持删除、增加动作的。因为是他结构是数组结构的。只有查找很方便、快捷的!
你把集合改成LinkList试试就可以了,他有自己的自身迭代器listIterator 你用这个迭代器就可以支持删除 增加之类的啦
回复 使用道具 举报
import java.util.*;
class ListDemo
{
public static void main(String[] args)
{
  //演示列表迭代器。
  ArrayList al = new ArrayList();
  
  //添加元素
  al.add("java01");
  al.add("java02");
  al.add("java03");
  
  //在迭代过程中,准备添加或者删除元素。
  Iterator it = al.iterator();
  
  while(it.hasNext())
  {
   Object obj = it.next();
   
   if(obj.equals("java02"))
   {
    al.remove("java01"); //这句执行后,集合中只有两个元素了,再判断while(it.hasNext()),结果为false了,就退出循环了。
   // al.add("java008");
   }
   
   System.out.println("obj="+obj);//第二次打印的obj记录的是java02,会打印出来的
  }
}
}
al中记录的是在while循环前的集合中的值,最好不要在迭代过程中使用集合对象的增删方法,会发生逻辑错误,在迭代过程中要使用迭代器的增删方法。


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