定义
数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。
线性表
顾名思义,线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构。
连续内存,类型相同
我们知道,计算机会给每个内存单元分配一个地址,计算机通过地址来访问内存中的数据。当计算机需要随机访问数组中的某个元素时,它会首先通过下面的寻址公式,计算出该元素存储的内存地址:
1 | a[i]_address = base_address + i * data_type_size |
优劣
优点显而易见,其时间复杂度仅仅为 $O(1)$,但是对于插入或者删除,都需要通过平移数组来完成操作,这就意味着最坏时间复杂度为 $O(n)$,如果容量还需要进行扩容,这是相当耗时的。
个人总结
- Java List 无法存储基本类型,都需要封住成 Integer 或者 Long 类,而装箱和拆箱是有很大的性能消耗的。
- 如果数据大小事先已知,并且对数据的操作非常简单,用不到 ArrayList 提供的大部分方法,也可以直接使用数组。
例子
- 普通数组封装(不支持扩容)
1 | class Array { |
输出结果:
1 | 插入成功: value: 1: index: 0 |
- 支持扩容的数组
1 | class GenericArray<T> { |
输出结果:
1 | add data: index: 0 value: 1 |
参考自极客时间