集合篇之ArrayList

一、源码如何分析?

1.成员变量

2.构造方法

3.关键方法

        一些添加的方法。

二、debug看源码

我们给出下面代码:

    public void test01() {ArrayList<Integer> list = new ArrayList<>();list.add(1);for (int i = 2; i <= 10; i++) {list.add(i);}list.add(11);}

1.第一次添加数据

1. 添加方法:

2. 确保内部容量:

3. 计算容量:

4. 确保真正的容量:

5. 扩容的方法:

围绕着这5个方法进行讲解:

        首先,add()方法里面先执行ensureCapacityInternal(size + 1); 这里的size是0,因为数组是空的,所以传入到ensureCapacityInternal()方法的参数就是minCapacity == 1

        其次,我们就需要计算容量,在calculateCapacity()方法中,里面的传入的两个参数,其中第一个参数elementData的值,在ArrayList() 构造方法里面已经赋过值了,就是DEFAULTCAPACITY_EMPTY_ELEMENTDATA,第二个参数就是前面的 1 。所以if里面判断正确,返回最大值,其中DEFAULT_CAPACITY = 10,所以10>1,最后返回的也就是10

        然后,我们在ensureExplicitCapacity()中这个方法,传入的minCapacity这个参数也就是 10。因为在if判断中,条件成立,也就是说容量不够,需要扩容了。

        最后,进入grow()方法,其中因为oldCapacity=0,newCapacity计算得出也是0。第一个条件判断就是0-10<0,所以把10赋值给newCapacity,第二个是数组容量最大的安全校验(暂时不用),最后一行代码也就是数组的拷贝,把elementData的容量变成了 10 。

        这样,我们的数组第一次扩容就这样说完了,我们回到add方法,elementData[size++] = e,这行代码就是把下标为0的位置给了元素1,然后size+1,说明数组有一个元素了。

2.第二次添加数据

        我们第二次添加是用for循环,添加了9个元素,我们分析这个过程。

        首先,for循环添加第一个元素的时候,ensureCapacityInternal(size + 1); 这里的size是1,因为数组之前添加了一个元素进行了size++,所以传入到ensureCapacityInternal()方法的参数就是minCapacity == 2。

        其次,在计算容量的时候,elementData已经不是默认的了,所以直接返回minCapacity。

        然后,我们在ensureExplicitCapacity()中这个方法里面,在if判断里面,其中minCapacity是等于2的,elementData.length在第一次添加数据的时候,已经扩容为10了,所以2-10<0,不需要扩容了。在代码里面,for循环添加了9个元素,执行流程都一样。

        最后,在add方法里面,把数据添加到数组后进行size+1。

3.第三次添加数据

        我们第三次添加一个元素,其中数组已经有10个元素了,我们分析这个过程。

        首先,ensureCapacityInternal(size + 1); 这里的size是10,因为数组里面有了10个元素,所以传入到ensureCapacityInternal()方法的参数就是minCapacity == 11。

        其次,在计算容量的时候,elementData已经不是默认的了,所以直接返回minCapacity。

        然后,我们在ensureExplicitCapacity()中这个方法,传入的minCapacity这个参数也就是 11。因为在if判断中,条件成立11-10>0,也就是说容量不够,需要扩容了。

        最后,进入grow()方法,其中因为oldCapacity=10, oldCapacity >> 1也就是右移一位也就是5,newCapacity计算得出是15。第一个条件判断就是15-10>0,直接走过该判断,最后一行代码也就是数组的拷贝,把elementData的容量变成了 15 。

         这样,我们的数组扩容就完成了。

三、面试题

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

  • 底层数据结构

ArrayList底层是用动态的数组实现的

  • 初始容量

ArrayList初始容量为0,当第一次添加数据的时候才会初始化容量为10

  • 扩容逻辑

ArrayList在进行扩容的时候是原来容量的1.5倍,每次扩容都需要拷贝数组

  • 添加逻辑

    • 确保数组已使用长度(size)加1之后足够存下下一个数据

    • 计算数组的容量,如果当前数组已使用长度+1后的大于当前的数组长度,则调用grow方法扩容(原来的1.5倍)

    • 确保新增的数据有地方存储之后,则将新元素添加到位于size的位置上。

    • 返回添加成功布尔值。

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

该语句只是声明和实例了一个 ArrayList,指定了容量为 10,未扩容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/711624.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

H5:段落标签与换行标签

目录 一.前言 二.正文 1.段落标签 2.换行标签 三.结语 一.前言 学习前端&#xff0c;从此起飞&#xff0c;愿你坚持&#xff0c;直至等顶。 二.正文 1.段落标签 <p></p> p为段落标签&#xff0c;由英文paragraph简写而来&#xff0c;用于将一段某一部分文本&am…

算法练习第九天|232.用栈实现队列、225. 用队列实现栈

熟悉栈和队列的方法&#xff1b;熟悉栈和队列的数据结构&#xff0c;不涉及算法 232.用栈实现队列 import java.util.Stack; class MyQueue {//负责进栈的Stack<Integer> stackIn;//负责出栈的Stack<Integer> stackOut;public MyQueue() {stackIn new Stack<&…

Rocketmq 入门介绍

从零手写实现 mq 详细介绍一下 rocketmq RocketMQ 是由阿里巴巴开发的分布式消息队列系统&#xff0c;它是一个低延迟、高可靠、高吞吐量的消息中间件。 RocketMQ 最初是作为阿里巴巴的内部项目进行开发的&#xff0c;后来成为了 Apache 软件基金会下的顶级项目&#xff0c;以…

精读《React 高阶组件》

本期精读文章是&#xff1a;React Higher Order Components in depth 1 引言 高阶组件&#xff08; higher-order component &#xff0c;HOC &#xff09;是 React 中复用组件逻辑的一种进阶技巧。它本身并不是 React 的 API&#xff0c;而是一种 React 组件的设计理念&…

【QT+QGIS跨平台编译】之五十三:【QGIS_CORE跨平台编译】—【qgssqlstatementparser.cpp生成】

文章目录 一、Bison二、生成来源三、构建过程一、Bison GNU Bison 是一个通用的解析器生成器,它可以将注释的无上下文语法转换为使用 LALR (1) 解析表的确定性 LR 或广义 LR (GLR) 解析器。Bison 还可以生成 IELR (1) 或规范 LR (1) 解析表。一旦您熟练使用 Bison,您可以使用…

transformers文本相似度

在自然语言处理(NLP)中,文本相似度是衡量两个文本之间语义或结构相似程度的一个重要概念。计算文本相似度的方法多种多样,适应不同的应用场景和需求。以下是一些常见的文本相似度计算方法: 1、余弦相似度: 通过将文本转换为向量表示(例如,使用词袋模型、TF-IDF 或 wor…

2024年个人护理赛道选品风向在哪?这份赛盈分销选品攻略必看!

2024年还会卷下去吗&#xff1f;看到一位行业大佬分享的内容深有感触&#xff1a;坚定做好产品&#xff0c;不做大卖&#xff0c;就不存在卷不卷。 有人出局&#xff0c;也会有人入局&#xff0c;并且深耕领域做大做强。 专注口腔护理的Bitvae入行不到两年&#xff0c;凭借一款…

C#学习(十四)——垃圾回收、析构与IDisposable

一、何为GC 数据是存储在内存中的&#xff0c;而内存又分为Stack栈内存和Heap堆内存 Stack栈内存Heap堆内存速度快、效率高结构复杂类型、大小有限制对象只能保存简单的数据引用数据类型基础数据类型、值类型- 举个例子 var c new Customer{id: 123,name: "Jack"…

Java中String类有哪些常用方法?

Java中的String类提供了许多有用的方法&#xff0c;用于处理字符串。以下是一些常用的方法及其简要描述&#xff1a; 1. **charAt(int index)**&#xff1a;返回指定位置的字符。 2. **length()**&#xff1a;返回字符串的长度。 3. **substring(int beginIndex, int endInd…

微信小程序手势冲突?不存在的!

原生的应用经常会有页面嵌套列表&#xff0c;滚动列表能够改变列表大小&#xff0c;然后还能支持列表内下拉刷新等功能。看了很多的小程序好像都没有这个功能&#xff0c;难道这个算是原生独享的吗&#xff0c;难道是由于手势冲突无法实现吗&#xff0c;冷静的思考了一下&#…

Google验证码,扫描绑定,SpringBoot+ vue

文章目录 后端1.使用Google工具类这个 类的 verifyTest 方法可以判断扫描绑定之后的app上面验证码的准确性。这个类通过g_user,g_code(就是谷歌验证器的secret,这个你已经插入到数据库 中)来生成相关二维码。2.用工具类自带的g_user,g_code来生成二维码2.1通过请求来生成相关二…

你知道vector底层是如何实现的吗?

你知道vector底层是如何实现的吗&#xff1f; vector底层使用动态数组来存储元素对象&#xff0c;同时使用size和capacity记录当前元素的数量和当前动态数组的容量。如果持续的push_back(emplace_back)元素&#xff0c;当size大于capacity时&#xff0c;需要开辟一块更大的动态…

【InternLM 实战营笔记】XTuner 大模型单卡低成本微调实战

XTuner概述 一个大语言模型微调工具箱。由 MMRazor 和 MMDeploy 联合开发。 支持的开源LLM (2023.11.01) InternLM Llama&#xff0c;Llama2 ChatGLM2&#xff0c;ChatGLM3 Qwen Baichuan&#xff0c;Baichuan2 Zephyr 特色 傻瓜化&#xff1a; 以 配置文件 的形式封装了大…

WebGIS----wenpack

学习资料&#xff1a;https://webpack.js.org/concepts/ 简介&#xff1a; Webpack 是一个现代化的 JavaScript 应用程序的模块打包工具。它能够将多个 JavaScript 文件和它们的依赖打包成一个单独的文件&#xff0c;以供在网页中使用。 Webpack 还具有编译和转换其他类型文…

自学新标日第六课(单词部分 未完结)

第六课 单词 单词假名声调词义来月らいげつ1下个月先月せんげつ1上个月夜中よなか3午夜昨夜ゆうべ0昨天晚上コンサートこんさーと1音乐会クリスマスくりすます3圣诞季誕生日たんじょうび&#xff13;生日こどもの日こどものひ&#xff15;儿童节夏休みなつやすみ&#xff13;…

看待事物的层与次 | DBA与架构的一次对话交流

前言 在计算机软件业生涯中,想必行内人或多或少都能感受到系统架构设计与数据库系统工程的重要性,也能够清晰地认识到在计算机软件行业中技术工程师这个职业所需要的专业素养和必备技能! 背景 通过自研的数据库监控管理工具,发现 SQL Server 数据库连接数在1-2K之间,想…

Yii2中如何使用scenario场景,使rules按不同运用进行字段验证

Yii2中如何使用scenario场景&#xff0c;使rules按不同运用进行字段验证 当创建news新闻form表单时&#xff1a; 添加新闻的时候执行create动作。 必填字段&#xff1a;title-标题&#xff0c;picture-图片&#xff0c;description-描述。 这时候在model里News.php下rules规则…

星座每日运势 api接口

接口数据api 接口平台&#xff1a;https://api.yuanfenju.com/ 开发文档&#xff1a;https://doc.yuanfenju.com/zhanbu/yunshi.html 支持格式&#xff1a;JSON 请求方式&#xff1a;HTTP POST <?php//您的密钥 $api_secret "wD******XhOUW******pvr"; //请…

利用coze 搭建“全功能“微信客服(2)

紧跟上篇 利用coze 搭建"全功能"微信客服&#xff08;1&#xff09;&#xff0c;不知道来龙去脉自行查阅 先表扬下coze: coze 是国内少数开放平台之一&#xff0c;里面提供各种插件还可以开发工作流&#xff0c;让你可以实现多模态全功能大模型 吐槽 没有API开放接口…

国外最流行的是AI,国内最流行的是AI培训教程

国外最流行的是AI&#xff0c;国内最流行的是AI培训教程。 最近李一舟AI教程事件&#xff0c;验证了这句话。 如今给客户做方案项目里能加点AI色彩&#xff0c;立项的成功率都变大(特别是事业单位)。 正因如此&#xff0c;大家都在狂补AI的知识&#xff0c;不然肚子里没点墨水&…