赞
踩
一、如何实现随机访问
1、什么是数组
数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。
2、怎么计算数组中任一元素在内存中的位置
因为数组线性表的特性,所以数组中的元素是一个接一个地按顺序排列的。又因为数组的内存空间是连续的,所以数组中的元素在内存中的位置也是相邻的。最后因为数组存放的数据都是相同的,所以数组为每一个元素分配的空间大小也是相同的。
由上可以得出数组中任一元素在内存的位置 = 数组的起始地址 + 数组下标 * 每一个元素的内存大小
通过计算的得到数中的元素的内存地址后就可以直接访问该地址,取得数据。这就是数组的随机访问。
二、为什么说数组的删除和插入时低效的
当在数组的末尾插入或者删除一个元素时的时间复杂度时O(1),但在数组中间插入或者删除一个元素时需要把变更位置后的元素整体向后或者向前移动一个位置,这时插入或者删除一个元素的时间复杂度时O(n),所以数据的插入和删除的时间复杂度大部分时候都是O(n),所以说数组的删除和插入时地效的。
优化方法:
当数组中的元素是无序的时候,可以把插入位置的元素直接移动到数组末尾,这个操作的时间复杂度是O(1);
删除元素时如果不追求数据的有序性,可以把删除的元素打上标记,然后批量删除,例如JVM标记清除垃圾回收算法;
三、容器能否完全代替数组吗
容器:已经把对数组的操作封装好了,可以直接使用,不需要考虑容量的问题,容器会自动扩容。
数组:更接近底层,性能更好。
使用场景:
容器:普通的日常业务中直接使用容器,因为损失的一点性能对系统的整体性能影响不大,ArrayList使用时最好指定长度,可以提升性能;
数组:可以用在最求极致性能的、底层的场景,如网络框架中
作者的经验:
四、为什么数组的下标时从0开始
数组中的元素的位置的计算公式
当下标从0开始时:
数组中任一元素在内存的位置 = 数组的起始地址 + 数组下标 * 每一个元素的内存大小
当下标从1开始时:
数组中任一元素在内存的位置 = 数组的起始地址 + ( 数组下标 - 1 ) * 每一个元素的内存大小
两者对比可知从0开始可以减少一次减法操作,让cpu少调用一次减法指令,性能更好
五、警惕数组越界
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。