Kotlin遍历集合导致并发修改异常的原因和解决方法

 更新时间:2021年03月09日 12:03:17   作者:大王派来巡山的小旋风  
这篇文章主要介绍了Kotlin遍历集合导致并发修改异常的原因和解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

各位android 老司机们,对于android 遍历结合的时候,发生并发修改异常一定毫不陌生;

之前看到过一篇文章,

在阿里巴巴Java开发手册中,有这样一条规定:

其实,增强for循环也是Java给我们提供的一个语法糖,如果将以上代码编译后的class文件进行反编译(使用jad工具)的话,可以得到以下代码:

1、原因:(其实我都不想在各位老司机面前再赘述这个了。-_-||)

这个异常产生的原因是,迭代器依赖于集合而存在,在判断成功后,集合中添加了新的元素,而迭代器并不知道,所有就报错了。其实这个问题说的是:迭代器遍历集合中的元素的时候,不要使用集合对象去修改集合中的元素。

翻看ArrayList源码和iterator()方法的具体实现,可以发现ArrayList继承于集合抽象类有一个成员变量modCount,在每次对元素进行增删改时,相应方法会将modCount++。而进行遍历iterator的next方法中首先会调用checkForComodification()方法,这个方法会对modCount和expectedModCount进行比较,expectedModCount是iterator的成员变量,一开始被赋值为modCount,两者不等就会抛出并发修改的异常。

解决方案:迭代器遍历的时候,可以通过迭代器修改集合中的元素,iterator类中也有修改元素的方法,并在修改完成后重新将modCount赋值给expectedModCount,之后进行next遍历检查就不会再报异常。

2、解决方法:

1、直接使用普通for循环进行操作

用for 循环遍历,然后直接用list 操作,eg:

2、foreach,或者Iterator 遍历的,直接用Iterator 来操作

3、问题复现

那么说了这多,其实就是mapIndexed 这个方法,这个语法糖其实是基于Iterator来遍历的。

所以,如果你要是在使用这个方式遍历的过程中从集合中remove元素,那就会有并发修改异常产生 ;

我还是贪图Kotlin 高级用法的甜头,而忽视了细节,导致问题出现,粗心大意,理解不深害死人。。

总结

到此这篇关于Kotlin遍历集合导致并发修改异常的原因和解决方法的文章就介绍到这了,更多相关Kotlin遍历集合并发异常内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android使用HBuilder的缓存方法

    Android使用HBuilder的缓存方法

    这篇文章主要介绍了Android使用HBuilder的缓存方法 ,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-12-12
  • Android之内置和外置sdcard路径显示并且写入数据的方法

    Android之内置和外置sdcard路径显示并且写入数据的方法

    今天小编就为大家分享一篇Android之内置和外置sdcard路径显示并且写入数据的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • 详解Android中motion_toast的使用

    详解Android中motion_toast的使用

    我们通常会用 toast(也叫吐司)来显示提示信息,例如网络请求错误,校验错误等等。本文为大家介绍一个非常有趣的toast组件 —— motion_toast,感兴趣的可以了解一下
    2022-06-06
  • Android冷启动优化的3个小案例分享

    Android冷启动优化的3个小案例分享

    为了提高App的冷启动耗时,除了在常规的业务侧进行耗时代码优化之外,为了进一步缩短启动耗时,需要在纯技术测做一些优化探索,本期我们从类预加载、Retrofit 、ARouter方面进行了进一步的优化,感兴趣的同学跟着小编一起来看看吧
    2023-07-07
  • Android中backgroundDimEnabled的作用

    Android中backgroundDimEnabled的作用

    这篇文章主要介绍了Android中backgroundDimEnabled的作用的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下
    2017-10-10
  • Android自定义View实现垂直时间轴布局

    Android自定义View实现垂直时间轴布局

    这篇文章主要为大家详细介绍了Android自定义View实现垂直时间轴布局的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • 解决android studio中使用monitor工具无法打开data文件夹问题

    解决android studio中使用monitor工具无法打开data文件夹问题

    这篇文章主要介绍了解决android studio中使用monitor工具无法打开data文件夹问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • Android实现颜色选取圆盘

    Android实现颜色选取圆盘

    这篇文章主要为大家详细介绍了Android实现颜色选取圆盘,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • Android Jetpack组件中LiveData的优劣

    Android Jetpack组件中LiveData的优劣

    LiveData是Jetpack组件的一部分,更多的时候是搭配ViewModel来使用,相对于Observable,LiveData的最大优势是其具有生命感知的,换句话说,LiveData可以保证只有在组件( Activity、Fragment、Service)处于活动生命周期状态的时候才会更新数据
    2023-04-04
  • Android通过自定义ImageView控件实现图片的缩放和拖动的实现代码

    Android通过自定义ImageView控件实现图片的缩放和拖动的实现代码

    通过自定义ImageView控件,在xml布局里面调用自定的组件实现图片的缩放。下面给大家分享实现代码,感兴趣的朋友一起看看吧
    2016-10-10

最新评论