概念:一种线性表数据结构,使用一组连续的内存空间,来存储一组有相同类型的数据。
线性数据结构(最多只有前后两个方向):数组、队列、栈、链表
非线性数据结构:树、图、堆
问题1:数组下标为什么从0开始?
因为数组是一段连续的内存,假如数组的所占用的内存起始地址为1000,则数组的第n个元素的起始内存地址为1000+n*每个元素所占内存的长度,n需要0开始。
问题2:数组的优缺点?
数组因为有索引,支持随机访问,根据下标查找的复杂度为O(1),因此在查找元素时速度较快,但是在增删时就会根据要删除或插入的位置去移动已有元素,平均复杂度为O(n),最好的情况为操作最后一个元素,复杂度为O(1)。
小知识点:
- 删除优化:删除数组元素时,为避免频繁的数据搬运,就暂时不删除,等数组没有存储空间时再真正的执行删除操作,JVM的标记清楚垃圾回收算法就是一个案例。
- C语言中内存越界:访问数组的本质就是访问一段连续的内存,只要数组通过偏移计算得到的内存地址是可用的,那么c语言就不会报错。
问题3:容器能否代替数组?
容器的优点:
- 封装数组操作,比如crud
- 动态扩容(通过指定容器大小,避免频繁的扩容,提升性能)