系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
- 第一章 String
- 第二章 Integer
- 第三章 ArrayList
- 第四章 LinkedList
- 第五章 HashMap
- 第六章 ConcurrentHashMap
- 第七章 AbstractQueuedSynchronizer(AQS)
- 第八章 ReentrantLock
前言
提示:这里可以添加本文要记录的大概内容:
👊👊👊
ArrayList 是一个数组队列,相当于动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。
和Vector不同,ArrayList中的操作不是线程安全的!所以,建议在单线程中才使用ArrayList,而在多线程中可以选择Vector或者CopyOnWriteArrayList。
提示:以下是本篇文章正文内容,下面案例可供参考
一、源码分析
接口和变量:
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable{
//默认容量大小
private static final int DEFAULT_CAPACITY = 10;
//指定ArrayList容量为0时返回该数组
private static final Object[] EMPTY_ELEMENTDATA = {
};
//当没有指定ArrayList容量时返回该数组
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {
};
//保存添加到ArrayList中的元素(ArrayList的底层其实就是一个数组)
transient Object[] elementData;
//ArrayList中元素数量
private int size;
.....
}
在这个源码中可以看出:
- ArrayList 底层使用一个 Object类型的 elementData数组来保存数据
- ArrayList 大小默认为0
ArrayList 使用 elementData保存数据,因此称为动态数组,使用 transient修饰。
transient代表 elementData无法序列化
构造函数
进行初始化操作
// 使用无参构造器,则初始 elementData为0
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; // {}
}
// 使用指定大小的构造器
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity]; // 传入长度
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA; // {}
} else {
throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);
}
}
public ArrayList(Collection<? extends E> c) {
Object[] a = c.toArray(