ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-12-04 12:32:59  阅读:147  来源: 互联网

标签:Java 容量 Object JDK1.7 面试 数组 问到 方法 底层


构造方法

在这里插入图片描述

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

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

  • 共同点是:数组都是空数组

  • 不同点是:数组不是同一个对象

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

在这里插入图片描述

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

增加元素

在这里插入图片描述

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

  • 检查底层Object数组容量

  • 在底层Object数组对应位置增加值

  • 返回true

扩容

接下来,我们看看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也是一样的,没有任何变化

  • 默认扩容规则为1.5倍

  • 如果扩容后的容量仍然不够,即仍然小于增加元素所需的容量,那么扩容后的新容量改为增加元素所需的容量

  • 判断扩容后的容量是否大于MAX_ARRAY_SIZE(值为Integer最大值减8)

  • 如果大于,就需要更大的容量,调用hugeCapacity

在这里插入图片描述

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

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

在这里插入图片描述

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

在这里插入图片描述

步骤也是一样的

  • 判断指定index是否合理

  • 判断容量是否足够

  • 使用arrayCopy将底层Object数组向后移一位,腾出index位置出来

  • 将底层Object数组的index位置赋上指定的值

  • 最后让size++

删除元素

clear方法

在这里插入图片描述

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

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

remove index方法

在这里插入图片描述

跟jdk1.7也是一摸一样的

  • 检查index是否合理

  • modCount自增,代表底层数组发生变化

  • 使用elementData获取旧的数据

  • 调用arrayCopy方法将底层Object数组向前移一位,空出最后一个位置

  • 让最后一个位置设置为Null,顺便让size自增,代表元素少一个

  • 设置为null,让gc回收不要的引用

remove object方法

在这里插入图片描述

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

  • 分为null和非null两种情况

  • null使用双等于号,非null使用equals判断是否相等

  • 遍历底层数组,去进行匹配符合的索引

  • 调用fastRemove去移除匹配的索引

看一下fastRemove方法

在这里插入图片描述

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

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

修改元素

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有