数组(Array)是一种线性表数据结构,他用一组连续的内存空间,来存储一组具备相同类型的数据。算法
关键词1:线性表:数组、链表、栈、队列等都是线性表结构;每一个线性表上的数据最多只有前和后两个方向。编程
关键词2:连续的内存空间和相同类型的数据。数组
因为数组具备上述两个限制,因此数组才具备杀手锏般的特性:“随机访问”。网络
数组数据的随机访问:数据结构
寻址公式:a[i]_address = base_address +i * data_type_size框架
数组与链表的区别:数组适合查找,支持随机访问,依据下标随机访问的时间复杂度为O(1);链表适合插入和删除,时间复杂度为O(1)。数据结构和算法
ArrayList最大的优点是能够将数组才作的细节封装起来,好比数组插入、删除数据时须要搬移其余数据等,另一个优点就是支持动态扩容。编程语言
对于业务开发,直接使用容器就够了,可是作一些很是底层的开发,好比开发网络框架,须要将性能的优化作到极致,这时候数组就会优于容器成为首选。post
从数组的内存模型来看,“下标”最确切的定义应该是“偏移(offset)”。若用a表示数组的首地址,a[0]就是偏移为0的位置,a[k]就是偏移k个type_size的位置,因此计算a[k]的地址的公式为:性能
a[k]_address = base_address + k * type_size
可是若是数组从1开始计数的话,寻址公式就会变成:
a[k]_address =base_address + ( k-1 ) * type_size
对比这两个公式能够发现,从1开始编号,每次随机访问数组元素都多了一次减法运算,对于CPU来说,就是多了一次减法指令。
二维数组a[m][n]的内存寻址公式:
a[i][j]_address =base_address + ( i * n + j ) * type_size