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.

2.5 KiB

This file contains ambiguous Unicode characters!

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遍历可能会引发多线程异常