Java中ArrayList学习笔记

释放双眼,带上耳机,听听看~!

1. 先看两段代码

Java中ArrayList学习笔记

这段代码在执行的时候会报

Java中ArrayList学习笔记

但是这样写就好着呢:

Java中ArrayList学习笔记

总结,研究报错的代码 ,在for循环的时候调用next()方法,next方法中调用了checkForComodification这个方法,这个方法里面判断modCount和expectedModCount不相等的时候就抛出ConcurrentModificationException这个异常。

原因:当for循环执行的时候首先调用了Java中ArrayList学习笔记

这个方法,这个方法初始化了expectedModCount=modCount,modCount的值是在add方法里面复制的,如当前程序为8,初始化给expectedModCount的值。当调用remove 方法的时候,将modCount++; 导致下一次循环的时候两个值不相同,就会报这个错误。

这里还有个知识点:

modCount 这个变量被transient关键字修饰,意思是不可被序列化。

参考文档:https://www.cnblogs.com/chenpi/p/6185773.html

2. 解决办法:

for (int i = students.size() - 1; i >= 0; i--) {
if (students.get(i).equals(\"李四\")) {
students.remove(i);
}
}
注意倒叙删除。正序删除的时候由于size一直变小,可能后面的删除不了。
Iterator<String> iterator = students.iterator();
while (iterator.hasNext()) {
if (iterator.next().equals(\"李四\"))
iterator.remove();
}
用iterator的remove方法可以删除,因为remove方法中将expectedModCount=modCount。

Java中ArrayList学习笔记

 

2. 多线程问题

Java中ArrayList学习笔记

这段代码在执行的时候有时候会报错,就是在方法内部调用 next方法的时候expectedModCount和modCount的值不一致引起的。

解决方案:

用CopyOnWriteArrayList方法,注意这个方法没有实现iterator.remove()。CopyOnWriteArrayList 里面在操作数据都用Lock进行了处理,但是有个方法getArray()没有lock。

3.  ConcurrentHaspMap它也是线程安全的,它里面是通过synchronized实现的。

 

给TA打赏
共{{data.count}}人
人已打赏
随笔日记

es6学习笔记-proxy对象

2020-11-9 4:38:02

随笔日记

2. CMake 系列 - 编译多文件项目

2020-11-9 4:38:04

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索