Arraylist
1. 特性
- 扩容,可变长度
- 随机访问(randomAccess)
- 有序性,插入的有序性
- 可重复(不是复制了元素,而是将元素的引用指向这个位置)
- 线程不安全
- 基于动态数组实现
2. 源码分析
-
add()
默认大小是10,扩容的时候是1.5倍扩容, 向列表中中添加元素,主要的时间是花在了扩容时数组元素复制上面,如果可以的话,可以指定列表的大小,避免扩容,在末尾加上元素,时间复杂度是o(1),在任意位置加上元素,时间复杂度是o(n) -
get() 通过index查找元素,时间复杂度是o(1)
-
remove()
remove要将后面的元素向前移一位,所以也有着时间的消耗,对于任意位置的元素remove,时间复杂度是o(n),对于队尾元素的删除,时间复杂度是o(1)。 -
序列化 因为列表的size中可能没有填满,所以列表不采用序列化,而是对列表中的每一个元素单独处理,传输的时候通过writeObject()和readObject()来实现对元素的操作。(使用字节流转换)
-
fast fail modCount记录的是列表结构发生变化的次数(列表添加或者删除元素),每次操作前后会对比modCount的大小,如果不一直,会抛出异常。
-
线程不安全相关场景
- 多线程同时向一个arraylist中写入元素
- 成功写入
- 写入完成,但是size不符合预期
- 写入崩溃(fast fail),因为前后modCount不同,引起fast fail
- 多线程同时向一个arraylist中写入元素
3. 使用场景
主要是适用于随机取元素,在尾部添加元素。