日期:2014-05-20  浏览次数:20929 次

菜鸟求解迭代器
public static void main(String[] args)
{
Collection cc = new HashSet();
cc.add("Hello");
cc.add("world");
cc.add("Hello World");
Iterator i = cc.iterator();
while(i.hasNext())
{
int ii = 0;
String s = (String)i.next();//1111
System.out.println(s);
ii++;
if(ii==1){
i.remove();

}System.out.println(s);//为什么我输出结果是下面那样的不是删除了么,还有内存是怎么操作的,象1111处是不是把引用给s通过地址来查找。求解,详细

}
}
}
//输出:F:\java\Jihe>java TestInterator
Hello World
Hello World
world
world
Hello
Hello
求解这句话是什么意思:void remove()从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。每次调用 next 只能调用一次此方法。如果进行迭代时用调用此方法之外的其他方式修改了该迭代器所指向的 collection,则迭代器的行为是不确定的。 
是不是说:我调用一次next(),是不是就可以调用一次remove()方法,假如我调用两次后调用一次remove()方法的话是不是那两个元素都删了呀

------解决方案--------------------
首先输出的s是删除前赋值了,所以肯定是一致的。
其次i.remove();是指:从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。
移除的是指向的集合,此时集合的长度已经减少了。
------解决方案--------------------
set是在内存中开辟一个范围,里面存储的是对象的引用,而String也是对象的引用;
String s = (String)i.next();表示s现在的指向地址应该就是你迭代器中对象的内存地址,
i.remove();移除的是你set当中的对象地址的引用,而不是把对象移除了,所以对象依然在那里,所以你现在用s一样可以获取到对象的值
------解决方案--------------------
list中没有s这个字符串了,但是s字符串再内存中依然存在的。