什么是数组?
数组是一种线性表。他用一组连续的内存空间,来存储一组具有相同类型的数据。
借助CPU的缓存机制,数组中的数据被预读。CPU每次从内存中读取数据的时候不是按照内存地址,还是读取一个数据块并保存到缓存当中。所以读取数组某个下标数据的时候也会将下标附近的数据读到缓存当中。这样就实现了比内存访问速度更快的机制。
数组的查询和存储?
数组可以通过下标进行随机读取。
数据根据二分查找的时间复杂度为O(logn),根据下标查找的时间复杂度就是O(1)。
寻址公式:
a[i]_address = base_address + i * data_type_size
data_type_size为数据类型的大小,比如说int型的话就是4字节。
那么二维数组的寻址地址:
对于m*n的数组,a[i][j](i<m,j<n)的地址为:
a[i]_address = base_address + ( i*n + j) *data_type_size
数组的插入和删除?
首先来看下插入。
假设将一个元素插到数组的末尾,则时间复杂度为O(1)。
如果插在最前面那就是O(n)。
所以可以得出平均时间复杂度就是O(n)。
有没有什么好方法呢?
有。现在要把一个元素插到k的位置,只需要把k位置原来的元素放到最后,然后再把新元素放到k5位置即可。这样时间复杂度就永远是O(1)。
数组的删除。数组的删除和数组的插入是一个道理,本质上就是数目上的变化。所以平均时间复杂度也可以得出来为O(n)。
但是这里有一个小方法,就是实现标记出来需要删除的数组。等到没有数组没有空间的时候再进行删除。可以类比jvm垃圾回收原理中的标记-清除法。
容器能否完全替代数据?
ArrayList和Array。
底层代码使用Array可以节省性能。
ArrayList不支持基础数据类型,需要封装为Integer和Long类。
数组的访问越界问题?