一. 简介
- ArrayList即数组列表,是线程不安全的,底层采用数组(即Object[] elementData)实现了数据的存储,故其查询快,增删慢。
二. 扩容
- 源码解析
- 若未添加数据,则默认容量为0;
- 若通过add()方法添加数据后,默认的初始容量为10;
- 当数组满了,再新增数据时,会以1.5倍进行扩容(如:原容量为10,扩容后为15),再将原数组中的数据复制到新数组中。
- 1.7和1.8的区别
1.8之后采用了右移一位的位运算实现扩容,提高了效率。
三. 增删
-
增
在新增数据时,会先进行长度的校验,若长度不够,则先进行扩容,然后再往指定位置新增数据。 -
删
在删除数据时,无论删除多少数据都不会自动缩容。
四. ArrayList(int initialCapacity)
-
虽然执行ArrayList(int initialCapacity)能够初始化数组大小,但是List的大小不会改变。
-
示例
import java.util.ArrayList; class Solution { public static void main(String[] args) { ArrayList arrayList = new ArrayList(10); System.out.println(arrayList.size()); } }
运行结果:
0
五. ArrayList封装为线程安全
可通过Collections.synchronizedList把一个ArrayList封装为线程安全,实现原理和Vector一样,对所有方法加synchronized。