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
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。
2. 多线程问题
这段代码在执行的时候有时候会报错,就是在方法内部调用 next方法的时候expectedModCount和modCount的值不一致引起的。
解决方案:
用CopyOnWriteArrayList方法,注意这个方法没有实现iterator.remove()。CopyOnWriteArrayList 里面在操作数据都用Lock进行了处理,但是有个方法getArray()没有lock。
3. ConcurrentHaspMap它也是线程安全的,它里面是通过synchronized实现的。
Java中ArrayList学习笔记的更多相关文章
- java中log4j学习笔记
Log4j是apache的一个开源项目,用来操作程序日志信息的框架.因便于管理,在工程中用来代替System.out打印语句.通过配置Log4j中的log4j.properties,可以指定日志信息的 ...
- 《深入理解Java虚拟机》学习笔记
<深入理解Java虚拟机>学习笔记 一.走近Java JDK(Java Development Kit):包含Java程序设计语言,Java虚拟机,JavaAPI,是用于支持 Java 程 ...
- Java:NIO 学习笔记-2
Java:NIO 学习笔记-2 上一篇 NIO 学习笔记-1 看了 尚硅谷 的相应教程,此处又对比看了 黑马程序员 的课程 JAVA通信架构I/O模式,做了相应的笔记 前言 在 Java 的软件设计开 ...
- JAVA中ArrayList用法
JAVA中ArrayList用法 2011-07-20 15:02:03| 分类: 计算机专业 | 标签:java arraylist用法 |举报|字号 订阅 Java学习过程中做题时 ...
- Java多线程技术学习笔记(二)
目录: 线程间的通信示例 等待唤醒机制 等待唤醒机制的优化 线程间通信经典问题:多生产者多消费者问题 多生产多消费问题的解决 JDK1.5之后的新加锁方式 多生产多消费问题的新解决办法 sleep和w ...
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
- java之jvm学习笔记五(实践写自己的类装载器)
java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...
- java之jvm学习笔记四(安全管理器)
java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...
随机推荐
- MySQL 的索引优化
索引类似大学图书馆建书目索引,可以提高数据检索的效率,降低数据库的IO成本.MySQL在300万条记录左右性能开始逐渐下降,虽然官方文档说500~800w记录,所以大数据量建立索引是非常有必要的.My ...
- windows下用C++修改本机IP地址
两种方法 第一种.使用DOS命令(即时生效) 第二种.修改注册表(重启生效) 1.打开SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards ...
- 如何优雅的关闭Java线程池
面试中经常会问到,创建一个线程池需要哪些参数啊,线程池的工作原理啊,却很少会问到线程池如何安全关闭的. 也正是因为大家不是很关注这块,即便是工作三四年的人,也会有因为线程池关闭不合理,导致应用无法正常 ...
- TensorFlow图像处理API
TensorFlow提供了一些常用的图像处理接口,可以让我们方便的对图像数据进行操作,以下首先给出一段显示原始图片的代码,然后在此基础上,实践TensorFlow的不同API. 显示原始图片 impo ...
- Flask构建微电影(一)
第一章.项目介绍 1.1.前言 本教程我将带领大家如何使用flask框架开发微电影网站.Flask是python中最受欢迎的轻量级web框架,flask扩展丰富,冗余度小,可自由选择组合各种插 ...
- 【java错误】Non-terminating decimal expansion; no exact representable decimal result
问题描述 意思是“无法结束的除法表达式:没有精确的除结果”.当时输入的10/3,结果应该是3.3333....333. 下面这种处理方式有问题. BigDecimal num3 = new BigDe ...
- mysql中如何处理字符
concat函数 使用方法: CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. 注意: 如果所有参数均为非二进制字符串,则结 ...
- JS中清空字符串前后空格
在JS 操作的时候 长期会有对字符串的操作, 但是在JS 中不像在C#中 有字符串的方法 Trim() 来对字符串进行处理 . 所以自己写一个对字符串前后清楚空格的方法还是有必要的 以免以后忘记了 ...
- 数据库历险记(一) | MySQL这么好,为什么还有人用Oracle?
关系型数据库(Relational DataBase Management System),简称 RDBMS.说起关系型数据库,我们脑海中会立即浮现出 Oracle.MySQL.SQLServer 等 ...
- pymysql安装
安装python3之后 链接数据库需要安装pymysql pymysql 下载地址 https://pypi.python.org/pypi/PyMySQL3/0.5 ,下载之后传到linux虚拟机, ...