这个问题是王争老师的《数据结构与算法之美》提到的,说实话,这个问题之前还未认真思考过。
在最初学习数组时,曾有过疑问,为什么下标是从0开始而不是从1开始编号。但那时这个疑问只是一闪而过,下一秒就没了。直到昨晚看到这个问题,才认真考虑了一下。
脑子过了一遍,猜想Java数组编号从0开始有没有可能是因为C语言的数组就是从0开始的。在学习Java时就发现跟C有相似之处,语言编程风格接近C++,所以这种可能性是存在的。
想法与王争老师类似,他认为最主要的原因是历史原因,引用原话,“C 语言设计者用 0 开始计数数组下标,之后的 Java、JavaScript 等高级语言都效仿了 C 语言,或者说,为了在一定程度上减少 C 语言程序员学习 Java 的学习成本,因此继续沿用了从 0 开始计数的习惯。”
对于数组编号从0开始,老师还提到一点,下标准确描述为"偏移",如果用a表示数组首地址, a[0]就表示偏移0个位置,表示首地址。如果偏移k个type_size位置,从0开始编号,计算k的内存地址就是
a[k]_address = base_address + k * type_size
如果是从1开始编号,计算k的内存地址就是
a[k]_address = base_address + (k-1)*type_size
由此可知,从1开始编号会给cpu造成一次减法运算,而通过下标查找数组元素是经常需要的用到的操作,能提高效率的地方应尽量提高。
至此,对于Java的数组编号为什么从0开始这个问题已经解决。