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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© d342784178 中级黑马   /  2015-1-28 09:02  /  1341 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

通过hashmap.entrySet的增强for循环
在循环是调用hashmap.remove()方法进行移除操作 结果操作失败
而通过itertor的remove()方法却操作成功
想问 增强的for循环不就是通过itertor进行遍历的吗
为什么结果不一样

评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1

查看全部评分

12 个回复

倒序浏览
增强的for循环通过itertor进行遍历,不能用hashmap.remove()方法
回复 使用道具 举报
play1369 发表于 2015-1-28 14:37
增强的for循环通过itertor进行遍历,不能用hashmap.remove()方法

为什么?
回复 使用道具 举报
这里有一个数组int[] arr = new arr[]{1,2,3}

简单说吧
for(int a : arr)
{
a=0;
}
sop(a[0]) // 输出会是 1

增强for只是相当于把遍历到的arr值赋给了a,你对a操作,并无影响arr

大概就这个意思   要是相对集合、数组操作,就不要用增强for
回复 使用道具 举报
hashmap.remove():是集合的方法
迭代时,不能使用集合的方法

同时使用会发生并发访问异常!
回复 使用道具 举报
补充一点:你应该使用iterator中的方法:remove() ,这样才不会发生我刚才说的那个异常,懂吗?
回复 使用道具 举报
gecl 中级黑马 2015-1-28 20:16:15
7#
并发修改异常。。。通过集合的方法操作集合就会出现这个异常
回复 使用道具 举报
gecl 发表于 2015-1-28 20:16
并发修改异常。。。通过集合的方法操作集合就会出现这个异常

我看了一下itertor.remove()的源代码 和map.remove()的源代码

[java] view plaincopy
itertor.remove()部分源代码  
Entry<K,V> current;     // current entry
public void remove() {  
            if (current == null)  
                throw new IllegalStateException();  
            if (modCount != expectedModCount)  
                throw new ConcurrentModificationException();  
            Object k = current.key;  
            urrent = null;
            HashMap.this.removeEntryForKey(key);
            expectedModCount = modCount;  
        }  


map.remove()部分源代码  
public V remove(Object key) {  
        Entry<K,V> e = removeEntryForKey(key);>  
        return (e == null ? null : e.value);  
    }  


可以看到 两者其实都是调用map的removeEntryForKey(key)方法去进行移除操作
区别是itertor.remove()在调用removeEntryForKey(key);前做了current = null 也就是释放了entry对map的引用

map.remove()方法却没有执行这步操作

所以当通过entryset去对map进行remove()操作时 因为entry还留有map的引用 所以操作失败

这样理解正确吗
回复 使用道具 举报
本帖最后由 我为你着迷 于 2015-1-28 21:53 编辑

高级for循环jdk1.5版本出现的  他的出现只为简化代码的书写  你要知道高级for循环和传统for循环的区别   高级for循环需要明确被遍历的目标 集合或者数组  如果遍历集合的时候你想要对集合进行操作 比如删除元素  要使用迭代器 因为只有迭代器才有remove的方法  如果遍历数组  想要对数组进行操作 那么要使用传统for循环   因为传统for循环可以定义角标 通过角标来操作数组中的元素   如果你只为获取元素  建议使用高级for循环   它的的出现只为简化书写 没有别作用。  
回复 使用道具 举报
学习了,昨天还在纠结for和增强for的区别
回复 使用道具 举报
我为你着迷 发表于 2015-1-28 21:52
高级for循环jdk1.5版本出现的  他的出现只为简化代码的书写  你要知道高级for循环和传统for循环的区别   高 ...

长知识了 谢谢
回复 使用道具 举报
我为你着迷 发表于 2015-1-28 21:52
高级for循环jdk1.5版本出现的  他的出现只为简化代码的书写  你要知道高级for循环和传统for循环的区别   高 ...

长知识了 谢谢
回复 使用道具 举报
毕老师的视频都说了这点,你看的太不仔细了,尽管我不仔细
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马