什么是数组
数组(Array)是一种线性表数据结构。用一组连续的内存空间,来存储一组具有相同类型的数据。
线性表
线性表就是排成线一样的数据结构
常见的线性表结构:数组、队列、链表、栈等
- 线性表最多有前跟后两个方向
连续的内存空间和相同的数据类型
- 随机访问
- 插入删除效率低
根据下标随机访问-寻址公式
1 | a[i]_address = base_address + i * data_type_size |
数组插入删除低效
为了保持数据连续性,需要移动数据,最好时间复杂度是 O(1),最坏时间复杂度是 O(n),平均时间复杂度是 O(n)
提高数组插入删除效率
JVM 标记清除垃圾回收算法核心思想,先对数据进行标记,等需要的时候对数据进行统一处理。
数组的访问越界
容器能否够完全代替数组
ArrayList优势:可将许多数组操作的细节封装起来,动态扩容;
动态扩容耗时,如果确定数据大小,可指定 ArrayList 大小,可以省去多次内存申请跟数据搬移的操作;
数组应用场景
- ArrayList 无法存储基本类型,自动装箱、封箱消耗资源。所以如果特别关注资源,或者希望使用基本类型,可使用数组
- 如果数组大小事先已知,且不需要 ArrayList 的大部分功能,可使用数组
- 多维数组,直观。
为什么数组要从 0 开始编号?
由于数组是通过寻址公式,计算出该元素存储的内存地址:
1 | a[i]_address = base_address + i * data_type_size |
如果数组是从 1 开始计数,那么就会变成:
1 | a[i]_address = base_address + (i-1)* data_type_size |
对于CPU来说,多了一次减法的指令。
当然,还有一定的历史原因。