数组为什么要从0开始呢?假如从1开始不行吗

在根据数组索引获取元素的时候,会用索引和寻址公式来计算内存所对应的元素数据,寻址公式是:数组的首地址+索引乘以存储数据的类型大小如果数组的索引从1开始,寻址公式中,就需要增加一次减法操作,对于CPU来说就多了一次指令,性能不高。

Arraylist集合是单列集合,它的底层是数组,它的特点是存取有序、可以重复。存取有序的原因是因为底层是数组,按照索引来存放和遍历取出,可重复是因为add方法没有做元素判断处理。Arraylist的初始长度是0(JDK1.6版本以前初始容量就是10),在首次添加元素的时候扩容成10,当10个元素都存满准备添加 11个元素的时候进行扩容,扩容成原来的1.5倍(1.5倍 + 1(JDK1.5时候))。选取默认容量为10,jdk官方的解释其实就是10是一个比较中位的大小,相比于1太小100太大,没有特殊的原因。

Arraylist底层源码不是特别复杂,我看过add方法的源码。第一次添加数据的时候,由于elementdata就是底层存元素的数组是空数组,就会走扩容grow方法,并且扩容的大小是静态成员属性defaultcapacity10,扩容完成后把待添加的元素存储到这个elementdata数组的第一个索引位置上。后续再添加元素的时候,会去比较“当前元素个数+1”和数组长度哪个大,如果后者大,就不需要扩容,所以在下一个索引位置直接添加元素;如果前者大,其实就是存不下了就又会走到grow方法,而grow方法内部记录旧容量和新容量,新容量是旧容量加上它右移1位(其实就是除2),相当于新容量是旧容量的1.5倍,(同时也会判断一下是否超过最大值),grow方法最后还走一个arrays.copy方法,扩容后把旧数组的元素全部复制到新数组,最后再执行下一个索引位置添加元素。

与他对应的是linkedlist是双向链表结构,也是有序可重复的集合,这两个集合的区别是arraylist进行数据查询效率明显比link快,linked无规则插入效率可能会比arraylist要快,因为如果做尾插arraylist也是很快的。

posted @   晴天晴yyysss  阅读(100)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示