编程语言
首页 > 编程语言> > Java集合框架(三),面试阿里的时候一定会问到的

Java集合框架(三),面试阿里的时候一定会问到的

作者:互联网

构造方法

在这里插入图片描述

可以看到无参构造使用的是DEFAULTCAPACITY_EMPTY_ELEMENTDATA空数组,而使用指定容量的构造方法,当容量为0时,使用的是EMPTY_ELEMENTDATA。

即将无参构造的空数组与指定容量为0的有参构造方法区分开来

我们来看一下为什么要加这个DefaultCapacity_empty_elementData空数组

在这里插入图片描述

注释上说,是为了了解添加第一个元素时要膨胀多少

增加元素

在这里插入图片描述

可以看到add方法与JDK1.7是几乎一样的,步骤都是

扩容

接下来,我们看看ensureCapacityInternal与ensureExplicitCapacity是怎么执行的

![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210604225642166.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

0dEVVRfVHJpbQ==,size_16,color_FFFFFF,t_70#pic_center)

这里是一个与JDK1.7的不同点,我们回顾一下JDK1.7的版本是怎样的

在这里插入图片描述

JDK1.7是要先针对第一次的无参构造产生的elementData进行扩容(要设置默认容量为10)

但JDK1.8却没有针对第一次的无参构造产生的空数组进行扩容,但其还调用了另一个方法calculateCapacity来进行计算需要的容量

那接下来就看看,这个方法做了什么

在这里插入图片描述

可以看到,这个calculateCapacity方法做的内容跟JDK1.7的ensureCapacityInternal的第一步针对无参构造的判断几乎是一致,JDK1.8只不过将这一步拆分出来放在了calculateCapacity里

然后ensureExplicitCapacity是一致的,都是ensureCapacityInternal最后都要进行调用的方法,判断当前新增所需的容量大于当前的容量,大于就要进行扩容

接下来看看grow方法

在这里插入图片描述

跟JDK1.7也是一样的,没有任何变化

在这里插入图片描述

可以看到,最大值顶多就是Integer的最大值

接下来,我们看看另一个add方法

在这里插入图片描述

可以看到,跟JDK1.7的是一样的,连rangeCheckForAdd都是一样的

在这里插入图片描述

步骤也是一样的

删除元素

clear方法

在这里插入图片描述

可以看到clear方法也是没变的,跟jdk1.7一摸一样

也是遍历底层Object数组,然后逐个设置为Null,让gc收集不要的引用

remove index方法

在这里插入图片描述

跟jdk1.7也是一摸一样的

remove object方法

在这里插入图片描述

也是跟JDK1.7一样,丝毫没有变过

看一下fastRemove方法

在这里插入图片描述

也是跟JDK1.7没用,没变的

调用arraycopy去将底层数组指定索引后面的那些元素往前移动一位,然后删除最后一位,将最后一位设为Null,让gc回收不要的引用

修改元素

标签:Java,容量,Object,JDK1.7,面试,数组,问到,方法,底层
来源: https://blog.csdn.net/m0_63174811/article/details/121713863