- ArrayList是可以为空的
- ArrayList可以有重复数据
- ArrayList是有序的
- ArrayList线程不安全
添加元素
- 先判断是否要扩容
- 在把元素放进去
ArrayList的底层是基于动态数组实现的原因
那么要扩容的话要扩多少呢?
源码里是在方法(ensureCapacity)里
int newCapacity = (oldCapacity * 3)/2 + 1;
扩大了-->空间浪费
扩小了-->下一次的扩容来的太快,降低运行效率
然后用copy 方法把数据拷贝到新数组
删除元素
- 按照下标删除
- 按照元素删除,这会删除ArrayList中与指定要删除的元素匹配的第一个元素
两种方式都是一个删除方法,就是把找到那个位置,然后把后面的数组往前面移一位.
然后把最后一个元素置为null 让GC回收
插入元素
其实做的也是添加元素的做法
从指定位置开始的所有元素利用System,arraycopy方法做一个整体的复制,向后移动一个位置 ,然后要进行扩容判断
ArrayList的优缺点
优点
ArrayList底层以数组实现查询非常快
添加也很快
缺点
删除,插入要移动后面很多元素,性能差
所以,ArrayList比较适合顺序添加、随机访问的场景。
ArrayList和Vector
非常明显的区别就是ArrayList线程不安全和Vector线程安全
那么要ArrayList线程安全的话就要用
List<String> synchronizedList = Collections.synchronizedList(list);
Vector 还有一个区别就是扩容, Vector 可以指定扩容多少, 默认情况下是*2.
为什么ArrayList的elementData是用transient修饰的?
ArrayList 是集成了序列化接口的,但是用transient就是不允许序列化,
因为ArrayList里有如果有很多不要的元素,那么就没有必要全部都序列化,
所以ArrayList 就重写了接口writeObject