Java中ArrayList学习笔记

Java中ArrayList学习笔记

  1. 先看两段代码

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

但是这样写就好着呢:

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

原因:当for循环执行的时候首先调用了

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

这里还有个知识点:

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

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

  1. 解决办法:

for (int i = students.size() - 1; i >= 0; i--) {

if (students.get(i).equals("李四")) {
    students.remove(i);
}

}
注意倒叙删除。正序删除的时候由于size一直变小,可能后面的删除不了。
Iterator iterator = students.iterator();
while (iterator.hasNext()) {

if (iterator.next().equals("李四"))
    iterator.remove();

}
用iterator的remove方法可以删除,因为remove方法中将expectedModCount=modCount。

  1. 多线程问题

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

解决方案:

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

  1. ConcurrentHaspMap它也是线程安全的,它里面是通过synchronized实现的。
    原文地址https://www.cnblogs.com/baoyi/p/java_arrayList.html
上一篇:ThreadLocal生成多线程WebClient


下一篇:《构建高可用Linux服务器 第3版》—— 2.1 快速排障的重要性和必要性