随机访问
数组是用连续内存空间存储同样数据类型的的一个线性表的数据结构。
- 线性表结构
线性表:数据像线穿起来一样的结构。包含数组、链表、队列、栈
非线性表:二叉树、堆、图 - 连续的存储空间和同样的数据类型
由于存在这两个属性,才让数组有了随机访问的属性。
如何实现下标的随机访问呢,通过int[] a=new int[10]来举例
其中内存首地址base_address为1000,这样可通过寻址公式
a[i]_address=base_address+i*data_type_size;
这个也是大部分语言数组从0开始的原因,从1开始的话,寻址公式就变成了a[i]_address=base_address+(i-1)*data_type_size;多了一次减法操作
注意:数组支持随机下标访问的时间复杂度为O(1),而不是普通查找方式。
插入和删除
数据的插入操作需要搬移插入位置之后的所有元素,平均时间复杂度为O(n),数组是有序的话,必须得这样操作,如果数据是无序的,那么我们就可以通过把插入位置元素移动到数组末尾,把要插入元素放到插入位置,时间复杂度降为O(1)
删除操作之后,为了保证数组的连续性,所以也需要搬移大量元素,平均时间复杂度也为O(1),可以通过先标记删除,等到空间不够的时候,进行一次真正的删除,降低移动大量元素的次数。
数据越界访问
不能超过定义数组的长度,C语言越界之后会定位到不属于数组的内存地址上,Java会检查越界异常
容器能否取代数组
- Java ArrayList 无法存储基本类型,需要封装为包装类型Integer等,而自动装箱和拆箱会有性能损耗,如果关注性能,就用数组
- 如果数组大小事先已知且数据操作简单,用数组
- 多维数组用数组会比较直观