定义
数组(Array)一种线性表数据结构。它用一组连续的内存空间,来存储具有相同类型的数据。
特性
支持随机访问
根据下标随机访问的时间复杂度为O(1)
缺陷
删除或者插入元素为了保证内存连续性,需要做大量的数据搬移工作。
插入优化技巧
- 如果数组是又序的,那么插入到K位置时,就只能搬移K后面的元素依次向后移动一位。时间复杂度为 O(n)。
- 对与无序数组,仅做存储作用的,插入新元素到K位置,可以先将K位置的元素移动到数组末尾位置,然后空出K位置,在插入新元素。如此技巧,会把时间复杂度降到O(1)。
删除优化技巧
- 单次删除操作并不移动数据,允许存在内存空洞,仅标记元素被删除标识;当多次删除后。内存不足时,统一触发一次数据搬移动作,以此来批量操作,提高删除效率。
- jvm垃圾回收就是此操作。
时间复杂度
插入和删除时间复杂,在数据尾部插入或者删除数据,不需要移动数据,复杂度为O(1)。在k位置插入或者删除数据需要移动n-k个元素,时间复杂度为O(n-k)。所以通过平均法得出O(n)。
注意点
- 防止数组越界访问。
动态扩容
数组在容量不够情况下,会从新申请更大一块空间,把原数组的内容全部迁移过去,因为要内存申请和数据迁移耗时比较大,因此在得知数据长度情况,直接带长度定义数组比较好。