简介
数组是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据。
数组如何实现随机访问
计算机会给每个内存单元分配一个地址,计算机通过地址来访问内存中的数据,当计算机需要随机访问数组中的某个元素时,它会通过下面的寻址公式,计算出该元素存储的内存地址。
公式如下:
a[i]_address = base_address + i * data_type_size
// data_type_size 表示数组中每个元素的大小,比如:当数组类型为 int 时,data_type_size 就为 4
复制代码
优化数组的插入和删除
插入
假设数组 a[10] 中存储了五个元素如下:1,2,3,4,5。现在要将元素 8 插入到 3 的位置,我们只需要将 3 放到 a[5] 然后再将 a[2] 赋值为 8 即可。这样一来,数组插入一个元素的时间复杂度就会变为 O(1)。
前提:该数组不需要排序
删除
假设数组 a[10] 中存储了五个元素如下:1,2,3,4,5。现在要将 1,2 删除,我们不需要移动别的元素补全被删除的元素,而是换另一种方法,将删除的元素标记起来,在数组新增元素的时候,判断数组的空间是否足够,当数组空间不足时,再把标记删除的元素删掉,这样一来,时间复杂度就变为O(1)。
数组和容器的对比
拿 ArrayList 来举例, ArrayList 无法存储基本类型,比如 int、long,需要封装为 Interger、Long 类,而且封装过程中的「自动装箱」和「自动拆箱」会消耗一定的性能。
数组的使用场景
- 如果对数据大小有个大概的了解,而且对数组的操作非常简单,也可以直接使用数组。
- 对于一般的系统业务开发,可以直接使用容器,毕竟对性能要求不高,但如果是针对底层的开发,需要将性能优化到极致,则推荐使用数组。