【List集合】List接口源码解读一(ArrayList)

目录

前言

1. List接口的基本信息

2. ArrayList

2.1.ArrayList 的基本信息

2.2. ArrayList 的构造方法

2.2.1 ArrayList 的构造方法一

2.2.2 ArrayList 的构造方法二

2.2.3 ArrayList 的构造方法三

 2.3 ArrayList 的扩容方式

总结


前言

        Java 语言由于其跨平台、社区良好等特性,在企业级应用、移动应用、互联网开发等领域广泛应用。今天,让我们来认识一下 java.util 包下的 ArrayList 集合框架


1. List接口的基本信息

根据源码所知:

代码文档的作者:乔什·布洛赫(Josh Bolch)和尼尔·盖夫特(Neal Gafter)

  • List 接口继承自Collection接口
  • List 的实现类:
  1. ArrayList
  2. LinkedList
  3. Vector
  • List 的抽象类:
  1. AbstractList
  2. AbstractSequentialList
  • 代码起始版本:Java 1.2

2. ArrayList

2.1.ArrayList 的基本信息

根据源码所知:

  •  ArrayList 继承自抽象类 AbstractList
  • ArrayList 实现的接口:
  1. List 接口:表示一个有序的集合
  2. RandomAccess:标记接口,用于标识支持高效随机访问的集合
  3. Cloneable:支持克隆(Clone)操作
  4. java.io.Serializable:可以将当前类的对象转换为字节序列,以便在网络传输和保存到文件

根据源码所知:

  • serialVersionUID :这是用于序列化和反序列化 ArrayList 对象时的版本号。当对 ArrayList 类进行修改时,需要更新该版本号,以确保序列化和反序列化的兼容性。
  • int DEFAULT_CAPACITY = 10:默认的初始容量值,表示当没有指定容量时,ArrayList 的初始容量为 10。
  • Object[ ] EMPTY_ELEMENTDATA = { }: 这是一个空的 Object 数组,用于表示空的 ArrayList 实例。
  • Object[ ] DEFAULTCAPACITY_ELEMENTDATA = { }: 这也是一个空的 Object 数组,与 EMPTY_ELEMENTDATA 不同之处在于,当第一个元素被添加时,如果 elementData 数组等于 DEFAULTCAPACITY_EMPTY_ELEMENTDATA,它将会被扩容为默认容量 DEFAULT_CAPACITY。
  • transient Object [ ] elementData:存储 ArrayList 元素的数组缓冲区。ArrayList 的容量等于这个数组缓冲区的长度。当 elementData 等于 DEFAULTCAPACITY_EMPTY_ELEMENTDATA 时,表示 ArrayList 是空的,并且当第一个元素被添加时,会将其扩容为默认容量。

2.2. ArrayList 的构造方法

2.2.1 ArrayList 的构造方法一

根据源码所知:

这个构造方法接受一个整型参数,其中 initialCapacity 表示初始化 ArrayList 的初始容量

  • 如果 initialCapacity 大于0,则初始化 elementData 数组为指定容量的 Object 数组。
  • 如果 initialCapacity 等于0,则将 elementData 数组初始化为空的常量EMPTY_ELEMENTDATA。
  • 如果 initialCapacity 小于0,则抛出 IllegalArgumentException 异常,提示传入的容量参数不合法。

2.2.2 ArrayList 的构造方法二

根据源码所知:

这是一个无参构造方法,用于构造一个空列表,初始容量为默认的大小。

  • 默认的空列表会将 elementData 数组初始化为DEFAULTCAPACITY_EMPTY_ELEMENTDATA。

2.2.3 ArrayList 的构造方法三

根据源码所知:

这个构造方法接受一个类型为Collection的参数c,用于构造一个包含指定集合元素的ArrayList。

  • 将集合c转换为数组,并赋值给 elementData。
  • 获取数组的长度作为列表的大小 size。
  • 如果数组的长度不为0,针对可能出现的类型转换问题进行处理,确保elementData是Object[] 类型。
  • 如果数组长度为0,将elementData初始化为空的常量EMPTY_ELEMENTDATA。

 2.3 ArrayList 的扩容方式

根据源码所知:

  • 当 ArrayList 需要进行扩容时,会调用 grow(int minCapacity)方法。这个方法会计算出新的容量值 newCapacity
  • 通常情况下,新容量值是旧容量的1.5倍(即 oldCapacity + (oldCapacity >> 1)
  • 接着会判断是否超出了最大数组容量(2^31 - 1 - 8),如果超出则调用 hugeCapacity 方法进行处理
  • 最后,通过调用 Arrays.copyOf 方法,将原数组的内容复制到新的具有更大容量的数组中,完成扩容操作

根据源码所知:

  • 当数组容量的新容量超出最大数组容量(2^31 - 1 - 8)时调用hugeCapacity 方法进行处理,如果需要的最小容量 minCapacity 小于 0,则会抛出 OutOfMemoryError 异常
  • 如果需要的最小容量 minCapacity 超出数组最大容量(2^31 - 1 - 8),则返回 2^31 - 1 给新容量,否则返回数组最大容量 2^31 - 1 -8 

总结

  • ArrayList 继承自 AbstractList 抽象类 

ArrayList 的应用场景:

  • ArrayList 的数据结构为 Object[ ] 数组,实现了 RandomAccess 接口,支持高效随机访问和克隆操作。适用于遍历、查找等读取数据元素的应用场景。
  • ArrayList 实现了 java.io.Serializable ,可以被序列化为字节序列,以便在网络传输和保存到文件

ArrayList 的扩容方式:

  1. 使用无参构造方法创建 ArrayList 时,实际上初始化赋值是一个空数组,当向数组中添加第一个元素时,数组容量扩容为10
  2. 当数组容量不足时,调用 grow() 方法进行扩容,每次扩容后容量会变为原来的 1.5 倍左右
  3. ArrayList 的最大容量为 2^31 - 1 或 2^31 -1 -8

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

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

相关文章

微信小程序开发系列(三十四)·自定义组件的创建、注册以及使用(数据和方法事件的使用)

目录 1. 分类和简介 2. 公共组件 2.1 创建 2.2 注册 2.3 使用 3. 页面组件 3.1 创建 3.2 注册 3.3 使用 4. 组件的数据和方法的使用 4.1 组件数据的修改 4.2 方法事件的使用 1. 分类和简介 小程序目前已经支持组件化开发,可以将页面中的功能…

Three 材质纹理 (总结三)

THREE.MeshLambertMaterial(网格 Lambert 材质) 该材质使用基于非物理的Lambertian模型来计算反射率。可以用来创建暗淡的并不光亮的表面,该材质非常易用,而且会与场景中的光源产生反应。 MeshLambertMaterial属性 # .color : …

24年上半年英语四六级报名时间25地汇总一览表

目前有25地公布了报名时间,大多集中在3月中下旬,具体时间以学校通知为准。 7个省份官宣 • 贵州(官方):3月18日12:00-3月29日16:00 • 黑龙江(官方):3月18日14:00-3月29日17:00 • 江西(官方):3月19日6:00-3月25日17:0…

05.BOM对象

一、js组成 JavaScript的组成 ECMAScript: 规定了js基础语法核心知识。比如:变量、分支语句、循环语句、对象等等 Web APIs : DOM 文档对象模型, 定义了一套操作HTML文档的APIBOM 浏览器对象模型,定义了一套操作浏览器窗口的API 二、windo…

deepseek-coder模型量化

1 简介 DeepSeek-Coder在多种编程语言和各种基准测试中取得了开源代码模型中最先进的性能。 为尝试在开发板进行部署,首先利用llama.cpp对其进行量化。 2 llama.cpp安装 git clone之后进入文件夹make即可,再将依赖补全pip install -r requirements.tx…

【Miniconda】基于conda避免运行多个PyTorch项目时发生版本冲突

【Miniconda】基于conda避免运行多个PyTorch项目时发生版本冲突 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望得到…

原创 《vtk9 book》 官方web版 第四章 - 可视化管线(1 / 2)

在前一章中,我们使用简单的数学模型创建了图形图像,用于光照、视图和几何。光照模型包括环境光、漫反射和镜面效果。视图包括透视和投影的效果。几何被定义为一组静态的图形原语,如点和多边形。为了描述可视化过程,我们需要扩展我…

读算法的陷阱:超级平台、算法垄断与场景欺骗笔记12_移动平台(上)

1. 广告 1.1. 广告收入的来源 1.1.1. 向客户推荐广告投放网址 1.1.2. 提供有效提高产品广告点击率的咨询服务 1.1.3. 从合作伙伴的广告收入中捞上一笔 1.2. 对于广告主来讲,他们无意于与各家网站逐一谈判 1.2.1. 这种方式一是成本过高,二是费时费力…

Github 2024-03-17 php开源项目日报 Top9

根据Github Trendings的统计,今日(2024-03-17统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目9Blade项目2Laravel:表达力和优雅的 Web 应用程序框架 创建周期:4631 天开发语言:PHP, BladeStar数量:75969 个Fork数量:24281 次关…

Delphi7应用教程学习1.3【练习题目】:文本及悬停文字的显示

这个例子主要用到了btn的Hint 属性,Hint是提示的意思。 还有Delphi7还是很好用的,改变了的属性是粗体,默认没有改变的属性为细体。

力扣新思路题:字符串轮转

非常简单的思路:将两个字符串s1接起来,并判断s2字符串是否是加长版s1字符串的子串 bool isFlipedString(char* s1, char* s2){if (strlen(s1) ! strlen(s2)) {return false;}int len strlen(s1);int i 0;char* arr (char*)malloc(sizeof(char) * len…

深入理解RAG:检索与生成的融合

原文地址:https://dev.to/portkey/understanding-rag-a-deeper-dive-into-the-fusion-of-retrieval-and-generation-1l4b 深入理解RAG:检索与生成的融合 检索增强生成(RAG)模型代表了检索系统和生成模型两大不同但互补组件完美结合的杰作。通过无缝集成相关信息检…

(x+2y+3z+4w)^4展开式经过合并同类项之后,xyzw的系数为?

求的展开式经过合并同类项之后,的系数 根据二项式定理,的系数为:

HarmonyOS NEXT应用开发—视频全屏切换案例

介绍 本示例介绍了Video组件和ohos.window接口实现媒体全屏的功能。 该场景多用于首页瀑布流媒体播放等。 效果图预览 使用说明: 点击全屏按钮,横屏媒体窗口。点击恢复窗口按钮,恢复媒体窗口。 实现步骤 在Video组件内调用 onFullscreen…

ARM 汇编指令:(七) STM/LDM多寄存器加载/多存储指令

目录 一.四种栈 1.满增栈:进栈(先移动指针再入栈,指针往地址增大的方向移动);出 栈(先出栈,栈指针往地址减小的地方移动)。 2.满减栈:进栈(先移动指针再入…

Rust 程序设计语言学习——所有权

这一节主要来学习 Rust 语言的其他特性,所有权、引用与借用、Slice 类型。 1 所有权 Rust 的核心功能(之一)是所有权(ownership)。虽然该功能很容易解释,但它对语言的其他部分有着深刻的影响。 所有程序…

【ESP32 IDF】I2C的使用

文章目录 前言一、I2C驱动使用的步骤二、I2C的使用2.1 配置驱动程序2.2 安装驱动程序2.3 主机写入数据写入数据的过程接收数据的过程 总结 前言 ESP32是一款强大的微控制器,广泛应用于物联网(IoT)和嵌入式系统开发。它具备丰富的硬件接口&am…

23. BI - 基于酒店建立内容推荐系统

本文为 「茶桁的 AI 秘籍 - BI 篇 第 23 篇」 文章目录 基于内容的推荐酒店数据说明TF-IDF基于酒店做推荐数据探索建模并计算执行推荐 总结 Hi,你好。我是茶桁。 上一节课咱们终于是将矩阵分解的完整内容全部都给大家讲完了。矩阵分解是推荐系统里面比较重要的一个环…

前端Vue开发中的百度地图定位组件:实现定位、反向地址查询与详细地址展示

一、引言 在前端开发中,地图定位是一个重要的功能,它能够为用户提供直观、便捷的服务。在许多应用场景中,我们不仅需要显示当前的地图定位,还需要将定位坐标反向转成地址,并展示详细地址。本文将介绍如何使用Vue和百度…

Django 解决新建表删除后无法重新创建等问题

Django 解决新建表删除后无法重新创建等问题 问题发生描述处理办法首先删除了app对应目录migrations下除 __init__.py以外的所有文件:然后,删除migrations中关于你的app的同步数据数据库记录最后,重新执行迁移插入 问题发生描述 Django创建的表&#xf…