map最后一个元素没有删除(遍历时删除元素会异常)
map最后一个元素没有删除(遍历时删除元素会异常)map.put("已经存在的key" xx) 逻辑不会对modCount操作修改原来值successwhile (it.hasNext()) 这个跟第2方式差不多,我就不列出来了一个断点debug进去看下,Map增、删、改都干了什么,源码太多我就截取了关键部分modCount和expectedModCount是两个关键属性
集合Map,在实战开发中应用非常广泛,好处我就不赘述。
学习目标- 学会Map的常见操作
- 理解为什么Map遍历中不能用Map自带的删除方法操作元素, 必须用Iterator的remove()【注意Map、Set、List都有这个问题】
程序员请看例子
初始化
遍历方式1、keySet这里把集合增、删、改都写出来了,注意看后面注释
while (it.hasNext()) 这个跟第2方式差不多,我就不列出来了
遍历方式3、values一个断点debug进去看下,Map增、删、改都干了什么,源码太多我就截取了关键部分
modCount和expectedModCount是两个关键属性
修改原来值success
map.put("已经存在的key" xx) 逻辑不会对modCount操作
新增值fail
map.put("不存在的key" xx) 逻辑会对modCount操作
删除值fail
map.remove("存在的Key"),逻辑会对modCount操作
迭代器的源码分析
- 初始化时,modCount值会同步给expectedModCount
- Iterator迭代中时,Map的删除或新增操作会改变HashMap中modCount的值,并且不会在同步给expectedModCount,导致出现concurrentModificationException
迭代器的remove正常分析
Iterator的remove()方法,为啥不异常了,看下面
abstract class HashIterator中的方法,有同步操作【红色箭头逻辑】
集合循环时操作元素,程序员们要特别注意啊
感觉能学到东西的,请关注啊