提到数组大家肯定不陌生,平时编码中都用用到,但是有没有想过数组在内存中是如何存储、如何访问。
数组是什么
下面我用专业术语解释一下,数组(Array)是一种线性表数据结构,它用一种连续的内存空间,来存储一组具有相同类型的数据。
从上面的专业解释中不难看到几个关键字
线性表:顾名思义就是像一条线一样排列的结构,每个线性表上的数据最多只有前和后两个方向。
连续内存空间和相同数据类型。
正是因为这两个限制,它才有了堪称杀手锏的特性“随机访问”。
数据访问
计算机会给每个内存单元分配一个地址,计算机通过地址来访问内存中的数据。
如上图,计算机给a数组分配了一块连续内存空间1000-1023,其中内存首地址是base_address=1000。
根据寻址公式我们可以得出当前数组存储的内存地址:
a[i]_address = base_address + i * date_type_size;
其中date_type_size表示每个元素的大小,a数组中存储 的是int类型,所以date_type_size为4个字节。
数组的“插入”和“删除”
假如数组a的长度为10,当前存储了5个元素,如果第五个元素之后追加,则不会造成数据的迁移,如果是在第三个位置插入新元素,那么插入过程中就会把第三位置及之后的数据都往后迁移,
删除数组的数据也是同理。
数组插入性能优化,如果数组中的数据是无序的,那么插入数据的时候尽量往最后一个元素后追加,这样不用进行数据的迁移,如果是有序的那就只能进行数据迁移
删除的性能优化,删除时可以先把相关的元素打删除标记,直到数组没有更多的存储空间时再将要删除的数据统一删除,这样就减少了数据删除导致的迁移。