集合面试题--ArrayList数组

目录

介绍数组

数组如何获取其他元素的地址值

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

操作数组的时间复杂度(插入,删除)

操作数组的时间复杂度(查询)

总结

源码分析

成员变量

构造函数

关键方法

 添加和扩容操作(第1次添加数据)

添加和扩容操作(第2至10次添加数据)

添加和扩容操作(第11次添加数据)

面试回答

ArrayList底层的实现原理是什么?

ArrayList list=new ArrayList(10)中的list扩容几次?

 如何实现数组和List之间的转换


介绍数组

数组(Array)是一种用连续的内存空间存储相同数据类型数据的线性数据结构。数组(Array)是一种用连续的内存空间存储相同数据类型数据的线性数据结构。

 

因为int占4个字节,所以也可以理解为占四块内存

数组如何获取其他元素的地址值

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

在根据数组索引获取元素的时候,会用索引寻址公式来计算内存所对应的元素数据,寻址公式是:数组的首地址+索引乘以存储数据的类型大小

如果数组的索引从1开始,寻址公式中,就需要增加一次减法操作,对于CPU来说就多了一次指令性能不高

操作数组的时间复杂度(插入,删除)

操作数组的时间复杂度(查询)

总结

源码分析

 一般来说问的比较多的就是,添加数据的逻辑,如果添加多个数据,他的扩容方式

成员变量

构造函数

关键方法

 添加和扩容操作(第1次添加数据)

 第一步,ensureCapacityInternal(size + 1); 确保内部的容量,第一次添加数据的时候,size的默认值是0,+1的操作,不就是1了

第二步,内部有调用了calculateCapacity(elementData, minCapacity));意思是计算容量。elementData是我们的成员变量,minCapacity就是我们刚刚传过来的1

第三步,因为我们调用了无参的构造方法,所以此时elementData 是等于DEFAULTCAPACITY_EMPTY_ELEMENTDATA

第四步,ensureExplicitCapacity(int minCapacity) 确认明确容量,因为我们是第一次添加,elementData里面是空的,所以我们需要扩容,他就会找grow方法

第五步,先拿到数组的容量,并且赋值给oldCapacity,现在数组容量是0,赋值给old,还是0,第二行进行扩容,右移一位,除以2,所以新容量还是0,然后第一个if语初始化数组长度,0-10<10。第二个if语句主要是一个安全判断,判断数组是否过大。最后执行elementData = Arrays.copyOf(elementData, newCapacity);进行数组拷贝,初始化数组,长度是10,并且赋值给elementData

第六步,elementData[size++] = e;将你传进来的值通过下标放到数组中,并且当前元素个数size+1,最后返回一个true。


添加和扩容操作(第2至10次添加数据)

 因为我们第一次添加数据,已经将数组初始化长度为10了,这时候添加数据,如果不超过10,是不需要扩容数组,假如现在是第10次添加数据了

第一步size此时是9,+1之后才是10,这个10往下传递

第二步依然要确保内部的容量,然后调用计算容量的方法,在计算容量时依然是10

第三步,确认容量,接收了参数10,判断if语句,在2到10的过程中,-10一直是<=0的,所以不会扩容,直接往数组中添加数据就行了,这就是在不扩容的情况下操作集合

添加和扩容操作(第11次添加数据)

当你添加第11给元素的时候,会先去确保内部容量,此时minCapacity是11,此时又走到计算容量返回11,在确保容量的方法中,11-10>0所以需要扩容

在扩容方法中,old是10,new等于10+10/2=15,所以容量变为原来的1.5倍

面试回答

ArrayList底层的实现原理是什么?

ArrayList list=new ArrayList(10)中的list扩容几次?

 如何实现数组和List之间的转换

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值