You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.
ArrayList 是一个数组队列, 相当于动态数组。与Java中的数组相比, 它的容量能动态增长。它继承于AbstractList, 实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。
+ ArrayList 继承了AbstractList, 实现了List。它是一个数组队列, 提供了相关的添加、删除、修改、遍历等功能。
+ ArrayList 实现了RandmoAccess接口, 即提供了随机访问功能。RandmoAccess是java中用来被List实现, 为List提供快速访问功能的。在ArrayList中, 我们即可以通过元素的序号快速获取元素对象; 这就是快速随机访问。
+ ArrayList 实现了Cloneable接口, 即覆盖了函数clone(),能被克隆。
+ ArrayList 实现java.io.Serializable接口, 这意味着ArrayList支持序列化, 能通过序列化去传输。
+ 和Vector不同, ArrayList中的操作不是线程安全的! 所以, 建议在单线程中才使用ArrayList, 而在多线程中可以选择Vector或者CopyOnWriteArrayList。
使用Object[] 数组存储数据, 初始容量为10
![[屏幕截图 2023-02-08 100723.png]]
### 自动扩容机制
当超过设定最小容量时, 通过grow方法对数组进行复制, 并调用newCapacity方法计算新容量
'private Object[] grow(int minCapacity) {
return elementData = Arrays.copyOf(elementData,
newCapacity(minCapacity));
}'
自动扩容50%
![[Snipaste_2023-02-08_10-36-43.png]]
## 总结
+ ArrayList自己实现了序列化和反序列化的方法, 因为它自己实现了 private void writeObject(java.io.ObjectOutputStream s)和 private void readObject(java.io.ObjectInputStream s) 方法
+ ArrayList基于数组方式实现, 无容量的限制( 会扩容)
+ 添加元素时可能要扩容( 所以最好预判一下) , 删除元素时不会减少容量( 若希望减少容量, trimToSize()) , 删除元素时, 将删除掉的位置元素置为null, 下次gc就会回收这些元素所占的内存空间。
+ 线程不安全
+ add(int index, E element):添加元素到数组中指定位置的时候,需要将该位置及其后边所有的元素都整块向后复制一位
+ get(int index): 获取指定位置上的元素时, 可以通过索引直接获取( O(1))
+ remove(Object o)需要遍历数组
+ remove(int index)不需要遍历数组, 只需判断index是否符合条件即可, 效率比remove(Object o)高
+ contains(E)需要遍历数组
+ 使用iterator遍历可能会引发多线程异常