ArrayList详解
ArrayList详解
[toc]
ArrayList具有以下特点:
- 底层:动态数组,初始容量为0,第一次添加元素时才会初始化为10
- 时间复杂度:下标查询O(1),随机插入或删除:O(n),末尾插入O(1)
- 线程安全性:不安全,如何保证安全?
- 在方法内使用:局部变量 -> 不存在线程安全问题
- synchroniozedList();
- 构造方法
- 无参:创建默认大小为10的空数组
- 初始化容量:返回一个给定容量大小的数组
- 参数是Collection对象:如果是ArrayList直接赋值,否则用copyOf复制
- 扩容机制:初始容量为10,每次扩容到之前的1.5倍,开辟新空间,并用copyOf将元素从旧数组复制到新数组
源码分析
1 | private static final int DEFAULT_CAPACITY = 10; // 初始容量为10 |
三种构造函数:
无参
1
2public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; }
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};给定初始容量:返回一个该容量大小的Object[]数组
1
2
3
4
5
6
7
8
9public 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);
}
}参数为Collection对象:
1
2
3
4
5
6
7
8
9
10
11
12public ArrayList(Collection<? extends E> c) {
Object[] a = c.toArray();
if ((size = a.length) != 0) {
if (c.getClass() == ArrayList.class) { // 如果参数是ArrayList,直接赋值
elementData = a;
} else { // 不是ArrayList,使用copyOf进行复制
elementData = Arrays.copyOf(a, size, Object[].class);
}
} else { // 为空直接返回EMPTY_ELEMENTDATA
elementData = EMPTY_ELEMENTDATA;
}
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LemontreeN's!