数组的学习笔记
什么是数组?如何实现随机访问?
数组是一种线性表数据结构,他用一组连续的内存空间,来存储一组具有相同类型的数据。
线性表结构:顺序表(数组)、链表、队列、栈。
非线性表结构:二叉树、堆、图等。
连续的内存空间和相同类型的数据 ——> 随机访问(random access)
a[i]访问地址计算公式:a[i]_address = base_address + i * data_byte_size
插入删除操作低效
原因:保证数据的连续性,需要移动大量数据。
是否可以优化:
1、如果数据没有规律,插入第K位数据,则移动K位数据到数组最后,然后在K为插入新数据。同样删除可以把末尾数据移动到要删除的坐标位置。
2、多次删除动作集中执行,先进行标记删除的位置,批量进行处理。(JVM的标记清除垃圾回收算法的核心思想)
数组越界问题(与语言有关)
int main(int argc, char* argv[]){ int i = 0; int arr[3] = {0}; for(; i<=3; i++){ arr[i] = 0; printf("hello world\n"); } }
容器是否能完全代替数组?
java ArrayList 举例:
很多数组操作的细节封装。比如:数组插入的搬移数据
动态扩容【注意:最好事先指定数据大小,可以节省内存申请和数据搬移操作】
ArrayList无法存储基本数据类型,比如int ,long,需要封装为Integer,Long类。转换操作消耗一定性能。
什么时候适合使用数组?
1、基本数据类型,特别关注性能
2、大小已知,且对数据操作简单,用不到ArrayList的大部分方法时
3、多为数组可以考虑使用
下标为什么从0开始?
1、寻址计算时减少一次减法计算。
2、历史原因。