概述
1 | public class ArrayList<E> extends AbstractList<E> |
ArrayList继承于AbstractList,实现了List接口,是一个长度可变的集合,实现了RandomAccess接口,Serializable接口,Cloneable接口,即ArrayList支持随机访问、可序列化、可克隆。ArrayList中允许存在null值,此外,和Vector不同的是,ArrayList不是线程安全的,所有的方法均不是同步方法也没有加锁。
fail-fast机制
fail-fast机制也被称为”快速失败”机制,是Java集合中的一种错误检测机制。在对集合进行迭代过程中,除了迭代器可以对集合进行修改(add,set,remove操作),其他的对集合进行修改(同上),都会抛出ConcurrentModificationException
错误。
该机制是基于一个变量——modCount实现的,每次对ArrayList进行add,set,remove等操作,都会执行modCount++。在获取ArrayList的迭代器时,会将ArrayList中的modCount保存在迭代中,每次执行add,set,remove等操作,都会执行一次检查,调用checkForComodification
方法,对modCount进行比较。如果迭代器中的modCount和List中的modCount不同,则抛出ConcurrentModificationException
elementData被transient修饰的原因
由于ArrayList的底层是基于动态扩容数组实现的,即elementData中可能会存在一些空值,在序列化时显然是不需要这些值的。所以ArrayList的设计者将elementData设计为transient,然后在writeObject
方法中手动将其序列化,并且只序列化了实际存储的元素,而不是整个elementData。
ArrayList源码阅读笔记
1 | package java.util; |