ifconfigapp
2010-04-05 16:36
浏览 262
已采纳

Iterator接口的一点小问题(TP)

[code="java"]public class TestIterator {
public static void main(String[] args) {
Collection c = new HashSet();
c.add(new Cat("mimi"));
c.add(new Cat("miaomiao"));
c.add(new Cat("wowo"));

    Iterator i = c.iterator();
    while(i.hasNext()) {
      Cat cat = (Cat)i.next();
      if(cat.getName().length() > 4) {
        i.remove();                 
      } 
      System.out.print(cat.getName() + " ");
    }
            System.out.println(c.size());
     }

}[/code]

请问下该接口的remove方法原理, 我明明删除了第二个对象, 为何全部遍历出来了, 而且结果又显示2呢 ?
真心求教.

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • xenocide 2010-04-05 20:39
    已采纳

    打个比方说,c 是个袋子,里面装着 3 只猫,你用 iterator 的 remove 方法把其中的一只叫 miaomiao 的取了出来,结果 c 里面还剩两只猫。

    remove 方法删除的是袋子和 miaomiao 之间的关系,而不是 miaomiao 本身。

    点赞 打赏 评论
  • xenocide 2010-04-05 17:09

    [code="java"]import java.util.*;

    public class TestIterator {
    static class Cat {
    private String name;
    public String getName() {return name;}
    public Cat(String name) {
    this.name = name;
    }
    }

    public static void main(String[] args) {
        Collection<Cat> c = new HashSet<Cat>();
        c.add(new Cat("mimi"));
        c.add(new Cat("miaomiao"));
        c.add(new Cat("wowo"));
    
        Iterator i = c.iterator();
        while(i.hasNext()) {
            Cat cat = (Cat)i.next();
            if(cat.getName().length() > 4) {
                i.remove(); // Cat("miaomiao") 已经从 c 里面删掉了,
                            // 但是局部变量 cat 还保存着对它的引用
            } else { // 如果想不输出删掉的量,加个 else 就可以了
                System.out.print(cat.getName() + " ");
            }
        }
    
        System.out.println("\n\nc 的成员只剩下: ");
        for (Cat cat : c) {
            System.out.print(cat.getName() + " ");
        }
    }
    

    }

    [/code]

    点赞 打赏 评论

相关推荐 更多相似问题