Java中ArrayList学习笔记

简介: Java中ArrayList学习笔记先看两段代码这段代码在执行的时候会报但是这样写就好着呢:总结,研究报错的代码 ,在for循环的时候调用next()方法,next方法中调用了checkForComodification这个方法,这个方法里面判断modCount和expectedModCount不相等的时候就抛出ConcurrentModificationException这个异常。

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
相关文章
|
18天前
|
Java 索引 容器
Java ArrayList扩容的原理
Java 的 `ArrayList` 是基于数组实现的动态集合。初始时,`ArrayList` 底层创建一个空数组 `elementData`,并设置 `size` 为 0。当首次添加元素时,会调用 `grow` 方法将数组扩容至默认容量 10。之后每次添加元素时,如果当前数组已满,则会再次调用 `grow` 方法进行扩容。扩容规则为:首次扩容至 10,后续扩容至原数组长度的 1.5 倍或根据实际需求扩容。例如,当需要一次性添加 100 个元素时,会直接扩容至 110 而不是 15。
Java ArrayList扩容的原理
|
3月前
|
存储 算法 Java
Arraylist 在 Java 中能容纳多少个元素?
【8月更文挑战第23天】
114 0
|
3月前
|
Java
如何在 Java 中将 Arraylist 添加到数组?
【8月更文挑战第23天】
108 0
|
3月前
|
存储 Java
|
22天前
|
存储 Java 索引
Java中的数据结构:ArrayList和LinkedList的比较
【10月更文挑战第28天】在Java编程世界中,数据结构是构建复杂程序的基石。本文将深入探讨两种常用的数据结构:ArrayList和LinkedList,通过直观的比喻和实例分析,揭示它们各自的优势与局限,帮助你在面对不同的编程挑战时做出明智的选择。
|
1月前
|
安全 Java 程序员
Java集合之战:ArrayList vs LinkedList,谁才是你的最佳选择?
本文介绍了 Java 中常用的两个集合类 ArrayList 和 LinkedList,分析了它们的底层实现、特点及适用场景。ArrayList 基于数组,适合频繁查询;LinkedList 基于链表,适合频繁增删。文章还讨论了如何实现线程安全,推荐使用 CopyOnWriteArrayList 来提升性能。希望帮助读者选择合适的数据结构,写出更高效的代码。
59 3
|
2月前
|
Java
java基础(12)抽象类以及抽象方法abstract以及ArrayList对象使用
本文介绍了Java中抽象类和抽象方法的使用,以及ArrayList的基本操作,包括添加、获取、删除元素和判断列表是否为空。
28 2
java基础(12)抽象类以及抽象方法abstract以及ArrayList对象使用
|
2月前
|
存储 安全 Java
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(基础篇)
从Java环境的搭建到实际代码的编写,从基本用法的讲解到底层原理的剖析,深度解析Java基础知识。本文是《Java学习路线》专栏的起始文章,旨在提供一套完整的Java学习路线,覆盖Java基础知识、数据库、SSM/SpringBoot等框架、Redis/MQ等中间件、设计模式、架构设计、性能调优、源码解读、核心面试题等全面的知识点,并在未来不断更新和完善,帮助Java从业者在更短的时间内成长为高级开发。
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(基础篇)
|
2月前
|
存储 安全 Java
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(进阶篇)
本文是Java基础的进阶篇,对异常、集合、泛型、Java8新特性、I/O流等知识进行深入浅出的介绍,并附有对应的代码示例,重要的地方带有对性能、底层原理、源码的剖析。适合Java初学者。
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(进阶篇)
|
1月前
|
Java 数据安全/隐私保护
java学习笔记(基础习题)
java学习笔记(基础习题)
34 0
下一篇
无影云桌面