基础数据结构---arraylist

129 阅读1分钟

Arraylist

1. 特性

  • 扩容,可变长度
  • 随机访问(randomAccess)
  • 有序性,插入的有序性
  • 可重复(不是复制了元素,而是将元素的引用指向这个位置)
  • 线程不安全
  • 基于动态数组实现

2. 源码分析

  • add()

      默认大小是10,扩容的时候是1.5倍扩容,
      向列表中中添加元素,主要的时间是花在了扩容时数组元素复制上面,如果可以的话,可以指定列表的大小,避免扩容,在末尾加上元素,时间复杂度是o(1),在任意位置加上元素,时间复杂度是o(n)
      
    
  • get() 通过index查找元素,时间复杂度是o(1)

  • remove()

      remove要将后面的元素向前移一位,所以也有着时间的消耗,对于任意位置的元素remove,时间复杂度是o(n),对于队尾元素的删除,时间复杂度是o(1)。
    
  • 序列化 因为列表的size中可能没有填满,所以列表不采用序列化,而是对列表中的每一个元素单独处理,传输的时候通过writeObject()和readObject()来实现对元素的操作。(使用字节流转换)

  • fast fail modCount记录的是列表结构发生变化的次数(列表添加或者删除元素),每次操作前后会对比modCount的大小,如果不一直,会抛出异常。

  • 线程不安全相关场景

    • 多线程同时向一个arraylist中写入元素
      • 成功写入
    • 写入完成,但是size不符合预期
    • 写入崩溃(fast fail),因为前后modCount不同,引起fast fail

3. 使用场景

主要是适用于随机取元素,在尾部添加元素。