关于java中的迭代器的问题

zhanghahahaa 2012-05-11 11:19:00
小弟刚接触到java.直接入题.
先描述一下问题:
问题1,在对集合使用迭代器时,不能使用集合本身去移除元素,而可以使用迭代器去移除,这是考虑到java多线程访问集合的导致的不安全的原因.
这句话对吗?如果对,接着往下看:
问题2,在使用迭代器取值时,并不是把集合元素本身赋值给迭代器,而是把集合元素的值赋值给了迭代器?
相信这句话也是对的吧?那么:
问题3,连续两次使用迭代器时,如果第一次使用时,用iterator移除了集合中的某个元素,那么为什么在第二次使用iterator访问时,输出的元素就少了刚才那个呢??不是说删除的只是iterator从集合中拷贝到的元素吗?为什么还改变了集合呢?
小弟猜测两点:
猜测a,同一个集合所有返回的迭代器都是同一个迭代器,第二次使用iterator实际还是第一次删除过元素的那个iterator.
猜测b,iterator确实修改了集合,那么和问题2不是矛盾吗?
问题4,对于一个hashMap集合,使用iterator移除了hashMap的键集keySet某个元素之后,在使用iterator访问hashMap的值集values时,发现,与刚才删除的键集里的那个key对应的value也不见了.
小弟彻底不懂了.代码附上:

package test5_10;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
* 集合的遍历或迭代操作
*
* @author yoyoflash
*
*/
public class Test03 {

public static void main(String[] args) {
Map stuMap = new HashMap();
// 向集合添加元素(键值对的方式添加)
for (int i = 0; i < 5; i++) {
Student stu = new Student(i, "学生" + i, 18);
stuMap.put(stu.getId(), stu);
// int--->Integer-->Object
}
System.out.println(stuMap);

// 1.通过foreach,注意,此时要指定遍历的是键集(keySet())还是值集(values())
System.out.println("通过Map对象的keySet()方法访问键的集合.");
for (Object key : stuMap.keySet()) {
System.out.println("key:" + key + ",value:" + stuMap.get(key));
}
System.out.println("************1************");
System.out.println("通过Map对象的values()方法访问值的集合.");
for (Object stu : stuMap.values()) {
System.out.println(stu);
}
System.out.println("************2************");
// 2.通过迭代器来迭代获取key.
Iterator it = stuMap.keySet().iterator();
// 通过hasNext()方法先判断是否有可迭代的元素
while (it.hasNext()) {
// 再通过next()方法来获取下一个元素.
Object key = it.next();
if(key==Integer.valueOf(3)){
System.out.println("key==3");
it.remove();
}
System.out.println("------");
System.out.println("key:"+key);
}
System.out.println("************3************");
Iterator it1 = stuMap.keySet().iterator();
// 通过hasNext()方法先判断是否有可迭代的元素
while (it1.hasNext()) {
// 再通过next()方法来获取下一个元素.
Object key = it1.next();
System.out.println("key:"+key);
}
System.out.println("************4************");
// 2.通过迭代器来迭代获取value
Iterator it2 = stuMap.values().iterator();
while (it2.hasNext()) {
System.out.println(it2.next());
}

}

}


在**2**后,移除了键为3的元素,在**3**后,再次使用iterator迭代访问集合时,不见了那个键为3的元素.在**4**后,访问值集,发现与键为3对应的值不见了.
请大侠耐心解答一下上面的问题1,2,3,4.解小弟迷惑.万分感谢!!!
...全文
155 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdojqy1122 2012-05-11
  • 打赏
  • 举报
回复
你的猜想可真多。。。
如果只是把值赋给迭代器就不用考虑线程安全问题了。应该传的是对象引用。
所以你的问题一和问题二就矛盾了。既然是对象引用,后来的问题你还要重新考虑一下。不解释了。
sdojqy1122 2012-05-11
  • 打赏
  • 举报
回复
有时间看看源码吧。Map的Iterator还是比较复杂的。不建议你刚开始接触java就看这些。给自己找麻烦。。。
zhanghahahaa 2012-05-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

你的猜想可真多。。。
如果只是把值赋给迭代器就不用考虑线程安全问题了。应该传的是对象引用。
所以你的问题一和问题二就矛盾了。既然是对象引用,后来的问题你还要重新考虑一下。不解释了。
[/Quote]
俺的猜想才俩,呵呵,不多.
你的意思是传的是引用?元素本身??能不能明确指明一下.小弟确实是刚入门.

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧