数组大家都很熟悉在平常的工作中也经常使用。大家有没有想过数组的角标为什么从0开始,数据角标从零开始绝不是Java语言特有的,反正我接触的编程语言都是这么做的。

什么是数组

数组(Array)是一种线性数据结构。他用一组连续的内存空间,来存储一组具有相同类型的数据。

连续、形同类型

数组的这两个限制使得他有一个杀手锏 ‘随机访问’ 。但是有利有弊,这两个限制让数组的很多操作变得很低效,比如删除、插入一个数据为了保证连续性就需要做大量的搬移操作。在我看来数组除了‘随机访问’ 剩下的都是缺点。

先请大家记住一个公式:
a[n]_address = base_address + n * data_type_size
这个公式是一维数组的寻址公式。base_address:内存首地址、data_type_size:每个元素的大小。
确切的说 ‘下标’ 应该定义为 ‘偏移’ 。如果用a来表示数组的首地址,a[0]就是偏移为0的位置,a[n]就是偏移n个data_type_size个位置所以计算内存地址就需要用到上面所写的这个公式进行计算。
但是,如果数组从1开始,那么计算a[n]的内存地址就变为:
a[n]_address = base_address + (n - 1) * data_type_size
对比两个公式,我们不难发现,从1开始每次随机访问都多来一次减法运算,对CPU来说就多了一次减法指令。对于数据这个非常基础的数据结构,效率要做到极致,所以为了减少一次减法运算,数组就选择来从0开始编号,而不是从1开始。

补充

上面介绍的是一维数据的寻址公式,再贴出一个二维数组的寻址公式:
对于 m * n 的数组,a[i][j](i<m,j<n)
address = base_address + (i * n + j) * data_type_size

理解有误的地方,欢迎大家在下方评论留言,大家共同学习共同进步。

打赏
支付宝 微信
上一篇 下一篇