数组定义:
一种线性表数据结构,使用一组连续的内存空间,存储一组具有相同数据类型的数据。
重点:
线性表:数据排成一条线一样的结构。与之对应的是非线性表,如树、图等。
连续的内存空间:这是一把双刃剑,带来的好处是数组的随机访问。弊端就是在数组中删除或者插入一个数据时,
为了保证内存的连续性,需要进行大量的数据搬移工作。
数组随机访问的实现:
定义整型数组 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倍。扩容操作会涉及内存申请和原有数据的搬移,数据量大时,比较耗时。