两限制(连续的内存空间和先沟通类型的数据)
a[i]_address = base_adress + i * data_type_size
提高效率: 将多次删除操作集中在一起执行,可以先记录以及删除的数据,但是不进行数据的迁移,而仅仅是记录,当发现没有更多空间储存时才执行真正的删除操作,这也是JVM标记清除垃圾回收算法的核心思想
从数组存储的内存模型来看,下标最确切的定义应该是偏移,如果用a来表示数组,a[0]就是偏移为0的位置也是首地址,a[k]就是偏移了k个type_size的位置
所以计算a[k]的内存地址:
a[k]_address = base_address + k * data_type_size
如果数组是从 1 开始计数,那么就会变成:
a[k]_address = base_address + (k-1)* data_type_size
对于CPU来说,多了一次减法的指令,数组作为非常基础的数据结构,效率的优化尽可能做到最好,所以为了减少一次减法操作,数组选择了从0开始编号
当然,还有一定的历史原因,C语言是这样设计的,java,js一类的语言沿用这一设计,或者说这样一定程度上减少C语言程序员学习java的学习成本