容器——ArrayList

前言

ArrayList 就是数组列表,相比数组,可以装载各种类型的数据。

底层实现主要依靠 Object[] elementData。

特点

  • ArrayList 底层是用数组实现的存储。
  • 查询效率高,增删效率低,线程不安全。使用频率很高。
  • 可以通过构造方法在初始化的时候指定底层数组的大小;
  • 无参构造方法1.7初始化,默认为调用有参构造方法,创造10容量的数组。
  • 无参构造1.8初始化,默认为空数组,只有真正add时,才分配初始10的容量。
  • 初始化容量为 10,超过10,会创建一个容量 1.5 倍的空数组,将原有数据拷贝过去。

增删为啥慢

  1. 扩容:

    当数组的容量超过限制,会扩容1.5倍,数组的扩容是将原数组的数据复制到一个1.5倍容量新数组上。

  2. add()有两种:

    • add(E e): 和数组一样,会在有数据的索引后一位添加数据,只是设及到临界扩容问题
    • add(int i,E e): 在指定位置新增数据,如涉及到数据位置的移动,这里与数组的实现方式不同,是在原有数据的基础上拷贝黏贴。
  3. remove()有四种:

    • remove(): 删除最后一位有数据的元素
    • remove(int i): 指定位置删除,如涉及到元素的移动,需要拷贝到新数组。
    • remove(Object o): 先遍历定位位置,如涉及到元素的移动,需要拷贝到新数组。
    • removeAll(Collection<?> c): 遍历确定位置,涉及到元素的移动,需拷贝的新数组。

由此我们可以知道,在末端添加或删除数组,效率不错;但只要涉及到元素的移动,就会触发数组的拷贝,效率低下。

文章目录
  1. 1. 前言
  2. 2. 特点
  3. 3. 增删为啥慢
|