集合篇之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,未扩容。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java虚拟机(JVM)从入门到实战【上】

Java虚拟机&#xff08;JVM&#xff09;从入门到实战【上】&#xff0c;涵盖类加载&#xff0c;双亲委派机制&#xff0c;垃圾回收器及算法等知识点&#xff0c;全系列6万字。 一、基础篇 P1 Java虚拟机导学课程 P2 初识JVM 什么是JVM Java Virtual Machine 是Java虚拟机。…

Flutter中Future和Stream关系

Future和Stream类是Dart异步编程的核心。 Future 表示一个不会立即完成的计算过程。与普通函数直接返回结果不同的是异步函数返回一个将会包含结果的 Future。该 Future 会在结果准备好时通知调用者。 Stream 是一系列异步事件的序列。其类似于一个异步的 Iterable&#xff0c;…

(三)softmax分类--九五小庞

softmax分类 对数几率回归解决的是二分类的问题&#xff0c;对于多个选项的问题&#xff0c;我们可以使用softmax函数&#xff0c;它是对数几率回归在N个可能不同的值上的推广 softmax各样本分量之和为1&#xff0c;当只有两个类别时&#xff0c;与对数几率回归完全相同 损失…

多个版本的Python如何不冲突?

转载文章&#xff0c;防止忘记或删除 转载于&#xff1a;电脑中存在多个版本的Python如何不冲突&#xff1f; - 知乎 (zhihu.com) 如何安装多版本的Python并与之共存&#xff1f; 如果你的工作涉及到Python多版本之间开发或测试&#xff0c;那么请收藏本文&#xff0c; 如果你…

Jvm之内存泄漏

1 内存溢出 1.1 概念 java.lang.OutOfMemoryError&#xff0c;是指程序在申请内存时&#xff0c;没有足够的内存空间供其使用&#xff0c;出现OutOfMemoryError。产生该错误的原因主要包括&#xff1a;JVM内存过小。程序不严密&#xff0c;产生了过多的垃圾。 程序体现: 内…

CSS 【详解】响应式布局(含 rem 详解)

响应式布局&#xff1a; 同一页面在不同的屏幕上有不同的布局&#xff0c;即一套代码自适应不同的屏幕。 为什么 rem 能用于实现响应式布局&#xff1f; px 绝对长度单位&#xff0c;不同客户端表现都相同&#xff0c;不具有响应式em 相对长度单位&#xff0c;相对于父元素的 f…

【MATLAB源码-第147期】基于matlab的QPSK调制解调在AWGN信道,瑞利信道,莱斯信道理论与实际误码率对比仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 四相位移键控&#xff08;QPSK&#xff0c;Quadrature Phase Shift Keying&#xff09;是一种重要的数字调制技术&#xff0c;它通过改变信号的相位来传输数据。与其他调制技术相比&#xff0c;QPSK在相同的带宽条件下能够传…

【HTML】HTML基础4.2(锚点链接)

目录 解释锚点链接 “公式” 例子 点击回首页 解释锚点链接 在我们浏览网页的时候&#xff0c;总有目录一样的功能&#xff0c;比如 这个时候&#xff0c;只要点击相应目录&#xff0c;就可以直接跳转到相应界面&#xff0c;比如&#xff0c;点击“演职员表” 今天就让我们一…

Leetcode438. 找到字符串中所有字母异位词 -hot100

题目&#xff1a; 代码(首刷看解析 2024年3月2日&#xff09;&#xff1a; 感觉自己这个ac率根本不可能找得到实习 class Solution { public:vector<int> findAnagrams(string s, string p) {int plen p.size(), slen s.size();if (slen < plen) return {};vector…

蓝桥杯备战刷题four(自用)

1.砝码称重 #include <iostream> #include <vector> using namespace std; const int N110; const int M100010; int w[N]; int n; int f[N][M]; int m; int ans; //f[i][j]表示到第i个砝码进行放置时的称得的重量为j的方案数 int main() {cin>>n;for(int i1…

【解决(几乎)任何机器学习问题】:交叉验证

在上⼀章中&#xff0c;我们没有建⽴任何模型。原因很简单&#xff0c;在创建任何⼀种机器学习模型之前&#xff0c;我们必须知道什么是交叉检验&#xff0c;以及如何根据数据集选择最佳交叉检验数据集。 那么&#xff0c;什么是 交叉检验 &#xff0c;我们为什么要关注它&…

HelixToolKit的模型旋转操作

前面加载了模型以后&#xff0c;鼠标拖动和缩放比较好操作&#xff1b;但是旋转似乎没有&#xff0c; 操作了一阵&#xff0c;也不是没有&#xff0c;应该是还不熟悉&#xff1b; 旋转的指示器在右下角&#xff0c;现在U面看到正面&#xff0c; 想看一下模型的背面&#xff0…

2024年最免费的DAW混音编曲FL Studio21.2.3.4004中文破解版下载

FLStudio21.2.3.4044中文破解版完整下载是最好的音乐开发和制作软件也称为水果循环。它是最受欢迎的工作室&#xff0c;因为它包含了一个主要的听觉工作场所。最新fl studio破解版有不同的功能&#xff0c;如它包含图形和音乐音序器&#xff0c;帮助您使完美的配乐在一个美妙的…

powershell常用命令分类

powershell常用命令分为三类&#xff1a;get类、set类、write类。 一 Get类 1.Get-Command &#xff1a; 得到所有PowerShell命令&#xff0c;获取有关 cmdlet 以及有关 Windows PowerShell 命令的其他元素的基本信息。包括Cmdlet、Alias、Function。 2.Get-Process &#xf…

【Java实战项目】SpringBoot + Vue3打造你的在线电子书平台!

今天给大家分享一个基础的Java实战项目&#xff0c;用SpringBoot和Vue3开发一个电子书平台&#xff0c;大家可以尝试做一下这个项目&#xff0c;以此来检验这段时间的学习成果&#xff01;废话不多说&#xff0c;下面正式进入项目&#xff1a; 一、项目介绍 1. 项目简介 在线…

mysql数据库学习笔记2——linux系统下安装,对库,表的基本操作语句

关于在linux系统下安装可以查看linux 安装mysql服务&#xff08;超详细&#xff09;_cannot write to-CSDN博客相关教程 对库的一些操作有 show databases查看有哪些数据库&#xff0c;create database “新建数据库名称” 创建新的数据库&#xff0c;use “数据库名称”切换…

H12-821_106

106.如图所示&#xff0c;RTA的GEO/0/0、GEO/0/1接口分别连接部门1和2&#xff0c;其网段分别为10.1.2.0/24、10.1.3.0/24网段&#xff0c;为限制部门1和2之间的相互访间&#xff0c;在RTA上部署traffic-filter&#xff0c;以下哪些部署方式是正确&#xff1f; A.配置ACL3000拒…

基于NSFW数据集的违规图片检测系统

目录 一、功能介绍 二、安装部署说明 2.1数据集简介 2.2文件目录说明 一、功能介绍 本程序是一个违规图片检测系统&#xff0c;能够识别用户上传的信息图片&#xff0c;是否包含有敏感&#xff08;NSFW&#xff0c;Not Safe For Work&#xff09;信息。 本程序使用雅虎开源的NS…

pikachu验证XXE漏洞

先随便输入一个内容查看 服务器有回显 接下来用bp抓包看下参数 有个xml参数&#xff0c;而且Content-Type: application/x-www-form-urlencoded&#xff0c;我们传入url编码后的xml内容试一下 <?xml version"1.0" encoding"UTF-8"?> <!DOCTYP…

Windows 11 23H2 based Tiny11 2311 中文输入法出错

参考&#xff1a; 1&#xff1a; Chinese IME dictionaries shows "not ready yet" in Windows Server 2022 - Windows Server | Microsoft Learn 2&#xff1a; Chinese basic typing not completing download - Microsoft Community 安装了 Tiny11 2311&#xff…