一、ArrayList(JDK7)

ArrayList 底层存储原理是数组,定义为: Object[] elementData

1.1、无参构造

相关代码如下:
image.png
ArrayList 无参构造实例化后,内部的 Object [] 为空数组。(在添加元素的时候,才进行数组的初始化,节省空间)

1.2、带参构造

image.png
根据指定的初始化大小,进行容器的初始化

1.3、添加元素

添加元素的操作有
image.png

1.3.1、add(E) 源码

image.png
上述代码得出几个结论:

  • 添加元素,直接往数组末尾添加,复杂度(O(1))
  • 实例化 ArrayList 实例时,未指定容器大小,默认为:10
  • 容器的扩容倍数为原来容器大小的 1.5倍
  • 容器大小存在上限值 Integer.MAX_VALUE

    1.3.2、add(int,E) 源码

    image.png
    上述得出结论,根据索引位置插入值,需要移动数据,复杂度为 O(n)

    1.4、移除

    image.png

    1.4.1、remove(Object)

    image.png
    从上述代码得出结论

  • 移除的时间复杂度同样为 O(n)

    二、ArrayList(JDK8)

    ArrayList 底层存储原理是数组,定义为: Object[] elementData
    个别名称不同,其他基本与 1.7 同

三、其他

3.1、System.arraycopy 使用案例如下

  1. public class StringDemo {
  2. public static void main(String[] args) {
  3. // 原来的数组:[1,2,3,4,6,7]
  4. // 现在往元素 4,6 之间插入 5,对应的索引为:4
  5. int index = 4;
  6. // 10 个元素的数组
  7. Object[] elementData = initElementData(10);
  8. System.arraycopy(elementData, index, elementData, index + 1,
  9. 6 - index);
  10. elementData[index] = 5;
  11. // 插入之后的数组
  12. System.out.print("新数组:");
  13. printArr(elementData);
  14. }
  15. /** 初始化测试数组 **/
  16. private static Object[] initElementData(int initialCapacity) {
  17. Object[] elementData = new Object[initialCapacity];
  18. elementData[0] = 1;
  19. elementData[1] = 2;
  20. elementData[2] = 3;
  21. elementData[3] = 4;
  22. elementData[4] = 6;
  23. elementData[5] = 7;
  24. // 打印
  25. System.out.print("原数组:");
  26. printArr(elementData);
  27. System.out.println();
  28. return elementData;
  29. }
  30. /** 打印数组 **/
  31. public static void printArr(Object[] arr){
  32. for(int i = 0;i < arr.length; i++){
  33. System.out.print(arr[i] + ",");
  34. }
  35. }
  36. }

输出结果
image.png