Collection c = new HashSet();
c.add(new Name("name1","ttt"));
c.add(new Name("name2","fff"));
c.add(new Name("name3","ggggg"));for (Iterator i = c.iterator(); i.hasNext();) {
Name name = (Name)i.next();
if (name.getStr2().length() > 4) {
i.remove();
}
System.out.print(name.getStr2() + " ");
}Name类的第一个字符串是str1,第二个是str2
我都remove了,为什么结果还是显示fff ttt ggggg 呢??

解决方案 »

  1.   

    Name name = (Name)i.next();
    这句里面已经实例化了
    不管你remove还是没有
    System.out.print(name.getStr2() + " ");
    还是去得到值
    你循环结束后打印
    System.out.println(c.size());
    试试结果应该是2吧 就是说ggggg的这个已经被删掉了
      

  2.   

    name里当然还是存在的哦,只是HashSet里面没有了,你有没有重新取出一下。你在取一下就没有了
      

  3.   


    Collection c = new HashSet();
    c.add(new Name("name1","ttt"));
    c.add(new Name("name2","fff"));
    c.add(new Name("name3","ggggg"));for (Iterator i = c.iterator(); i.hasNext();) {
    Name name = (Name)i.next();
    if (name.getStr2().length() > 4) {
    i.remove();
    }
    System.out.print(name.getStr2() + " ");
    }如果你要满足条件就把Collection 里面的删掉的话,那上面的i.remove()就不能那么写了
    应该写c.remove(name);name是你要删除的对象,因为Collection 里面分别有3个对象就是你打印出来的。
      

  4.   

    i.remove();
    只是把Iterator迭代器 里面的remove了
    而你在remove之前已经把迭代器里面的赋给Name对象了
    Name name = (Name)i.next();
    remove之后name是完全没变化的
    remove
    void remove()
    从迭代器指向的集合中移除迭代器返回的最后一个元素(可选操作)。每次调用 next 只能调用一次此方法。如果进行迭代时用调用此方法之外的其他方式修改了该迭代器所指向的集合,则迭代器的行为是不明确的。 
      

  5.   

    你remove了没错,但是你remove前将值赋给了name,你打印name当然可以全部打印出来,你打印c看看
      

  6.   

    你没有删除集合类中的元素,当然显示还是这样。for (Iterator i = c.iterator(); i.hasNext();) {
    Name name = (Name)i.next();
    if (name.getStr2().length() > 4) {
    i.remove(); // 没删除成功~~因为没有针对删除HashSet元素的操作
    }迭代器remove()的定义:
    remove() 
              从迭代器指向的集合中移除迭代器返回的最后一个元素(可选操作)。我整了个新代码:public class TestIterator { public static void main(String[] args) {
    Collection<Name> c = new HashSet<Name>();
    c.add(new Name("name1", "ttt"));
    c.add(new Name("name2", "fff"));
    c.add(new Name("name3", "ggggg")); for (Iterator<Name> i = c.iterator(); i.hasNext();) {
    Name name = (Name) i.next();
    if (name.getStr2().length() > 4) {
    c.remove(name);
    }
    }

    for(Iterator<Name> j = c.iterator(); j.hasNext();) {
    Name name = (Name)j.next();
    System.out.println(" : " + name.getStr1() + " " + name.getStr2());
    } }}
      

  7.   


    不可以用你的那个方法的吧,iterator的对象是锁定啊,外界不能删除的
      

  8.   


    for (Iterator i = c.iterator(); i.hasNext();) {
      Name name = (Name)i.next();
      if (name.getStr2().length() > 4) {
        i.remove();
      }
      System.out.print(name.getStr2() + " ");
    }这里,name并没有实例化,而是一个Name类型的引用指向了集合c中的一个对象。集合c中存放三个Name类型的引用,而三个Name对象存放在堆中。每次remove都减去一个引用。但Name对象还是存在的,这时,声明的name仍指向着对象。
    所以虽然每次remove,集合c的容量都减1,但name还是指向着对象。
    循环结束,集合容量变为2,但是堆里还是存放三个对象。这正是垃圾回收的作用,因为一个对象没有引用了,所以gc会择机回收这个对象。
      

  9.   

    你打印的时候 是循环内的局部变量值  name还是存在的 只是集合的引用删掉了
    你重新循环打印就知道了