为什么大多数语言数组的索引都是从0开始的?

数组定义:

   一种线性表数据结构,使用一组连续的内存空间,存储一组具有相同数据类型的数据。

重点:

   线性表:数据排成一条线一样的结构。与之对应的是非线性表,如树、图等。

   连续的内存空间:这是一把双刃剑,带来的好处是数组的随机访问。弊端就是在数组中删除或者插入一个数据时,

   为了保证内存的连续性,需要进行大量的数据搬移工作。

数组随机访问的实现:

   定义整型数组 int[] array = new int[5],每个int分配四个字节,总共20个字节。假设内存地址从2000开始。结构如下图:

base_address:起始地址,值为2000。

data_type_size:数据类型所占字节数,值为4。

当使用下表访问数组数据时,如array[3],会执行如下计算:

   array[3]_address = base_address + 3 * data_type_size = 2000 + 3*4 = 2012

便可得出array[3]的存储地址为2012。

如果数组下标不是从0开始,而是从1开始,要访问同样的数据,计算如下:

   array[4]_address = base_address + (4-1)*data_type_size = 2000 + 3*4 = 2012

相比于索引从0开始,索引从1开始时,需要多进行一次减法运算。

关于ArrayList的几点注意:

1、ArrayList无法存储int,long等基本类型,需要使用Integer,Long等类。这样就会有Autoboxing,Unboxing的性能消耗。

2、ArrayList有动态扩容机制。当存储空间不足时,空间会自动扩容为原来的1.5倍。扩容操作会涉及内存申请和原有数据的搬移,数据量大时,比较耗时。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值