您现在的位置是:首页 > 文章详情

Java中ArrayList学习笔记

日期:2019-04-27点击:390

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
原文链接:https://yq.aliyun.com/articles/700419
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章