今天面试一个高级javaer,中途插科打诨问了一个非常简单的问题,数组下标为什么从0开始?
结果这位兄台笑着说这么简单的问题,可就是答不上来,在此做个记录。
目的:数组下标从零开始主要是提高性能,减少CPU
计算。
如何读取数组数据的呢?
假设我们去读取array[2]
的值,我们如何读取它的值的呢?
- 首先数据的获取方式:
- 先得到一个数据的地址(
array
) - 然后对其进行偏移(
数组的下标
)
如果使用指针来表示就是*(array+2)
,所以array[2]
和*(array+2)
是等价的。看成计算公式可以为:an=a0+n
那么为什么不能从一开始呢?
如果数组从1开始计算,那么获取数组的第一个元素表达方式就是array[1]
,但是数组的第一个元素的地址就是array
,CPU
每次获取元素需要减去1。即必须这样做:*(array + 1 - 1)
,其中 +1 操作是数组的下标,-1 操作是为了获得正确的元素地址。所以每次获取数组数据时为了获取正确的地址,都需要-1操作,增加了cpu
的负担。如果从零开始,就少了 -1 操作,提交了CPU
的效率。