2023年7月14日,ArrayList底层

news2024/12/23 9:29:41

集合框架图:

集合框架图

集合和数组的区别

集合与数组的区别
List

AarrayList

ArrayList底层实现原理

ArrayList的底层实现是基于数组的动态扩容。

  1. 初始容量:当创建一个新的ArrayList对象时,它会分配一个初始容量为10的数组。这个初始容量可以根据需求进行调整。
//表示默认的初始容量,该值被设置为10
private static final int DEFAULT_CAPACITY = 10;
//表示一个空数组,即一个长度为0的Object数组。
private static final Object[] EMPTY_ELEMENTDATA = {};
//表示具有默认初始容量的空数组。在无参构造函数中使用这个数组。
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
//该数组用于存储ArrayList的元素。它是ArrayList的核心数据结构。
   transient Object[] elementData; 
//表示ArrayList当前包含的元素数量。
   private int size;
//构造一个具有指定初始容量的ArrayList。如果指定的初始容量大于0,将创建一个具有此大小的新数组;如果初始容量为0,则使用空数组EMPTY_ELEMENTDATA;否则,抛出IllegalArgumentException异常。
   public ArrayList(int initialCapacity) {
       if (initialCapacity > 0) {
           this.elementData = new Object[initialCapacity];
       } else if (initialCapacity == 0) {
           this.elementData = EMPTY_ELEMENTDATA;
       } else {
           throw new IllegalArgumentException("Illegal Capacity: "+
                                              initialCapacity);
       }
   }
//构造一个默认初始容量的ArrayList。使用数组DEFAULTCAPACITY_EMPTY_ELEMENTDATA作为初始数组。
   public ArrayList() {
       this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
   }
  1. 添加元素:当使用ArrayList的add(E element)方法添加一个元素时,它会先检查数组是否已满。如果数组已满,ArrayList会执行以下操作:
  1. 创建一个新的容量更大的数组,默认情况下是原数组容量的1.5倍(在Java 7之前是原数组容量的两倍)。例如,如果原数组的容量是10,那么新数组的容量将是15。
  2. 将原数组中的元素复制到新数组中。
  3. 更新ArrayList的内部数组引用为新数组。
  4. 更新ArrayList的内部数组引用为新数组。
 private void grow(int minCapacity) {
  		//获取当前 ArrayList 的容量
        int oldCapacity = elementData.length;
        //计算新的容量,即将原始容量的一半加到原始容量上,相当于扩容 50%。
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        //检查新容量是否小于所需的最小容量,如果是则将最小容量设为新容量。这个检查主要用于确保扩容后的容量足以容纳要添加的元素。
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        //检查新容量是否超过了 MAX_ARRAY_SIZE,如果是则调用 hugeCapacity(minCapacity) 方法获取一个巨大容量。MAX_ARRAY_SIZE 是 Java 数组的最大容量限制。
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        //将 elementData 数组扩容为新的容量。利用 Arrays.copyOf() 方法可以方便地将数组扩容并复制原始元素到新数组中。
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
  1. 删除元素:当使用ArrayList的remove(int index)方法删除一个元素时,ArrayList会执行以下操作:
  1. 将要删除的元素之后的所有元素向前移动一个位置,以覆盖被删除的元素。
  2. 更新ArrayList的内部数组长度。

public E remove(int index) {
    //校验索引是否越界,如果索引值小于0或者大于等于当前列表的大小 size,则抛出 IndexOutOfBoundsException 异常。
        rangeCheck(index);
//(用于记录结构性修改次数的计数器)加1,表示对 ArrayList 进行了一次修改。
        modCount++;
    //调用 elementData(index) 方法获取要删除的元素的值,将其保存为 oldValue。
        E oldValue = elementData(index);
//计算需要移动的元素的个数,即从待删除元素的下一个位置到列表末尾的元素个数。
        int numMoved = size - index - 1;
    //检查是否需要移动元素。如果 numMoved 大于 0,表示待删除的元素不是列表的最后一个元素,需要将后面的元素往前移动,以填补删除元素的空缺。
        if (numMoved > 0)
            //使用 System.arraycopy() 方法将后面的元素往前移动。从 elementData 数组的 index+1 位置开始,复制 numMoved 个元素到 elementData 数组的 index 位置,覆盖待删除元素。
            System.arraycopy(elementData, index+1, elementData, index,numMoved);
    //将列表中最后一个位置的元素设置为 null,以便让垃圾回收机制回收。同时,将列表的大小 size 减1,相当于删除了一个元素。
        elementData[--size] = null; 
//返回被删除的元素
        return oldValue;
    }

  1. 获取元素:当使用ArrayList的get(int index)方法获取一个元素时,ArrayList会直接通过索引访问数组中的对应元素。
    E elementData(int index) {
        return (E) elementData[index];
    }
  1. 内存管理:当ArrayList执行扩容或缩容操作时,它会分配新的内存来存储更大或更小的数组,然后将旧数组中的元素复制到新数组中。这意味着在扩容或缩容过程中会涉及到内存的分配和复制操作,可能会带来一定的性能开销。

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

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

相关文章

在Python中优雅地用多进程:进程池 Pool、管道通信 Pipe、队列通信 Queue、共享内存 Manager Value

Python 自带的多进程库 multiprocessing 可实现多进程。我想用这些短例子示范如何优雅地用多线程。中文网络上&#xff0c;有些人只是翻译了旧版的 Python 官网的多进程文档。而我这篇文章会额外讲一讲下方加粗部分的内容。 创建进程 Process&#xff0c;fork 直接继承资源&am…

zigbee DL-20无线串口收发模块使用(双车通讯,电赛模块推荐)

前言 &#xff08;1&#xff09;通常有时候&#xff0c;我们可能会需要让两个MCU进行通讯。而zigbee是最适合两个MCU短距离通讯的模块。他使用极其简单&#xff0c;非常适合两款MCU之间的进行数据交互。 &#xff08;2&#xff09;在各类比赛中&#xff0c;经常出现需要两个MCU…

独立看门狗 IWDG

独立看门狗介绍 Q&#xff1a;什么是看门狗&#xff1f; A&#xff1a;可以理解为对于一只修勾的定时投喂&#xff0c;如果不给它吃东西就会狂叫&#xff0c;因此可以通过观察修勾的状态来判断喂它的人有没有正常工作。 在由单片机构成的微型计算机系统中&#xff0c;由于单…

【业务功能篇44】Mysql 海量数据查询优化,进行分区操作

业务场景&#xff1a;当前有个发料表&#xff0c;随着业务数据量增多&#xff0c;达到了几千万级别水平&#xff0c;查询的效率就越来越低了&#xff0c;针对当前的架构情况&#xff0c;我们进行了分区的设置&#xff0c;通过对时间字段&#xff0c;按年月&#xff0c;一个月作…

ios 启动页storyboard 使用记录

本文简单记录ios启动页storyboard 如何使用和注意事项。 xcode窗口简介 以xcode14为例&#xff0c;新建项目如下图&#xff0c;左边文件栏中的LaunchScreen.storyboard 为默认启动页布局。窗口中间部分是storyboard中的组件列表&#xff0c;右侧为预览&#xff0c;可以看到渲…

H3C-Cloud Lab-实验-DHCP实验

实验拓扑图&#xff1a; 实验需求&#xff1a; 1、按照图示为R1配置IP地址 2、配置R1为DHCP服务器&#xff0c;提供服务的地址池为192.168.1.0/24网段&#xff0c;网关为192.168.1.254&#xff0c;DNS服务器地址为202.103.24.68&#xff0c;202.103.0.117 3、192.168.1.10-1…

Camtasia Studio 2023 最新中文版,camtasiaStudio如何添加背景音乐

Camtasia2023的视频编辑工具可以帮助用户剪辑、裁剪、旋转、调整大小、添加特效、混合音频等。用户还可以使用Camtasia2023的字幕功能添加字幕和注释&#xff0c;以及使用其内置的特效和转场来提高视频的视觉效果。 Camtasia Studio 2023新功能介绍 的光标增强 由于光标在屏幕…

解决win10电脑无法访问局域网内其它共享文件问题

问题描述 今天需要上传文件到一个共享的局域网文件夹里&#xff0c;在我的电脑和浏览器访问//192.168.0.16//public都提升访问受限&#xff0c;开始以为是因为用户没授权&#xff0c;后来一般沟通后&#xff0c;发现其它电脑都能正常访问的&#xff0c;所以确定是自己电脑配置…

Caerulein,17650-98-5,雨蛙肽,以三氟醋酸盐形式提供的十肽分子

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ Caerulein |雨蛙素&#xff0c;雨蛙肽&#xff0c;蓝肽| CAS&#xff1a;17650-98-5 | 纯度&#xff1a;95% ------雨蛙素结构式---- ----试剂参数信息--- CAS号&#xff1a;17650-98-5 外观&#xff08;Appearance&a…

java中使用POI生成Excel并导出

注&#xff1a;本文章中代码均为本地Demo版本&#xff0c;若后续代码更新将不会更新文章 需求说明及实现方式 根据从数据库查询出的数据&#xff0c;将其写入excel表并导出 我的想法是通过在实体属性上写自定义注解的方式去完成。因为我们在代码中可以通过反射的方式去获取实体…

js小写金额转大写 自动转换

// 小写转为大写convertCurrency(money) {var cnNums [零, 壹, 贰, 叁, 肆, 伍, 陆, 柒, 捌, 玖]var cnIntRadice [, 拾, 佰, 仟]var cnIntUnits [, 万, 亿, 兆]var cnDecUnits [角, 分, 毫, 厘]// var cnInteger 整var cnIntLast 元var maxNum 999999999999999.9999var…

vulnhub靶场red:1教程

靶场搭建 靶机下载地址&#xff1a;Red: 1 ~ VulnHub 难度&#xff1a;中等 信息收集 arp-scan -l 这里没截图忘记了&#xff0c;就只是发现主机 扫描端口 nmap --min-rate 1000 -p- 192.168.21.130 nmap -sT -sV -sC -O -p22,80 192.168.21.130 先看80端口 看到链接点一…

怎么又快又准的确定业务系统属于等保几级?

等保2.0政策已经落地严格执行了一段时间&#xff0c;但大家对于等保政策还有很多不清楚。这不不少人在问&#xff0c;怎么又快有准的确定业务系统属于等保几级&#xff1f; 怎么又快又准的确定业务系统属于等保几级&#xff1f; 【回答】&#xff1a;根据《信息安全等级保护管…

AtcoderABC255场

A - You should output ARC, though this is ABC.A - You should output ARC, though this is ABC. 题目大意 给定整数R和C以及一个2x2矩阵A&#xff0c;需要输出A R,C的值。 思路分析 简单的矩阵查找。根据给定的索引R和C&#xff0c;找到矩阵A中相应位置的元素&#xff0c…

实例014 OutLook界面

实例说明 程序主界面包括菜单栏、工具栏、状态栏和树状视图。OutLook界面美观、友好&#xff0c;是一个很实用的程序主界面&#xff0c;并且菜单栏和工具栏是可移动的。运行本例效果如图1.14所示。 图1.14 Out Look界面 技术要点 一般程序的菜单栏和工具栏是不可移动的&…

【Ajax】笔记-服务端响应JSON数据

服务端响应JSON数据 构建测试案例 键盘按键触发请求服务端&#xff1a; 键盘按下触发事件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width,…

项目中前端如何实现无感刷新 token!

场景&#xff1a;线上平台有时会出现用户正在使用的时候&#xff0c;突然要用户去进行登录&#xff0c;这样会造成很不好的用户体验。 1.请求采用的是axios 2.平台的采用的 JWT(JSON Web Tokens) 进行用户登录鉴权。 原因&#xff1a; 1.突然跳转到登录页面&#xff0c;是…

【IVI】EVS 应用

EVS 应用 1、EVS启动2、EvsStateControl.cpp 控制管理2.1 EvsStateControl初始化2.2 EvsVehicleListener.h唤起处理EvsStateControl::updateLoop() 3、EVS 应用逻辑流程 android12-release 增强型视觉系统 (EVS) 1、EVS启动 Android 包含与 EVS 管理器和车载 HAL 通信的 EVS 应…

CAD2021安装教程适合新手小白【附安装包和手册】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、下载文件二、使用步骤1.安装软件前&#xff0c;断开电脑网络&#xff08;拔掉网线、关闭WIFI&#xff09;2、鼠标右击【AutoCAD2021(64bit)】压缩包选择【解…

解密:GPT-4框架与训练过程,数据集组成,并行性的策略,专家权衡,推理权衡等细节内容

大家好&#xff0c;我是微学AI&#xff0c;今天给大家解密一下GPT-4框架与训练过程&#xff0c;数据集组成&#xff0c;并行性的策略&#xff0c;专家权衡&#xff0c;推理权衡等细节内容。2023年3月14日&#xff0c;OpenAI发布GPT-4&#xff0c;然而GPT-4的框架没有公开&#…