快捷搜索:  汽车  科技

map最后一个元素没有删除(遍历时删除元素会异常)

map最后一个元素没有删除(遍历时删除元素会异常)map.put("已经存在的key" xx) 逻辑不会对modCount操作修改原来值successwhile (it.hasNext()) 这个跟第2方式差不多,我就不列出来了一个断点debug进去看下,Map增、删、改都干了什么,源码太多我就截取了关键部分modCount和expectedModCount是两个关键属性

map最后一个元素没有删除(遍历时删除元素会异常)(1)

背景

集合Map,在实战开发中应用非常广泛,好处我就不赘述。

学习目标
  • 学会Map的常见操作
  • 理解为什么Map遍历中不能用Map自带的删除方法操作元素, 必须用Iterator的remove()注意Map、Set、List都有这个问题
代码举例

程序员请看例子

map最后一个元素没有删除(遍历时删除元素会异常)(2)

初始化

遍历方式1、keySet

这里把集合增、删、改都写出来了,注意看后面注释

map最后一个元素没有删除(遍历时删除元素会异常)(3)

遍历方式2、EntrySet

map最后一个元素没有删除(遍历时删除元素会异常)(4)

while (it.hasNext()) 这个跟第2方式差不多,我就不列出来了

遍历方式3、values

map最后一个元素没有删除(遍历时删除元素会异常)(5)

HashMap源码分析

一个断点debug进去看下,Map增、删、改都干了什么,源码太多我就截取了关键部分

modCountexpectedModCount是两个关键属性

修改原来值success

map.put("已经存在的key" xx) 逻辑不会对modCount操作

map最后一个元素没有删除(遍历时删除元素会异常)(6)

新增值fail

map.put("不存在的key" xx) 逻辑会对modCount操作

map最后一个元素没有删除(遍历时删除元素会异常)(7)

map最后一个元素没有删除(遍历时删除元素会异常)(8)

删除值fail

map.remove("存在的Key"),逻辑会对modCount操作

map最后一个元素没有删除(遍历时删除元素会异常)(9)

迭代器的源码分析

  • 初始化时,modCount值会同步给expectedModCount
  • Iterator迭代中时,Map的删除或新增操作会改变HashMap中modCount的值,并且不会在同步给expectedModCount,导致出现concurrentModificationException

map最后一个元素没有删除(遍历时删除元素会异常)(10)

map最后一个元素没有删除(遍历时删除元素会异常)(11)

map最后一个元素没有删除(遍历时删除元素会异常)(12)

迭代器的remove正常分析

Iterator的remove()方法,为啥不异常了,看下面

abstract class HashIterator中的方法,有同步操作【红色箭头逻辑】

map最后一个元素没有删除(遍历时删除元素会异常)(13)

集合循环时操作元素,程序员们要特别注意啊

感觉能学到东西的,请关注啊

map最后一个元素没有删除(遍历时删除元素会异常)(14)

map最后一个元素没有删除(遍历时删除元素会异常)(15)

猜您喜欢: