我看了一下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的引用 所以操作失败
这样理解正确吗 |