【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

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

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

相关文章

3.Redis命令

Redis命令 Redis 根据命令所操作对象的不同, 可以分为三大类: 对 Redis 进行基础性操作的命令,对 Key 的操作命令,对 Value 的操作命令。 1.1 Redis 首先通过 redis-cli 命令进入到 Redis 命令行客户端,然后再运行下…

Spring Web MVC入门(2)

学习Spring MVC Postman介绍 在软件工程中, 我们需要具有前后端分离的思想, 以降低耦合性. 但是在测试后端代码时,我们还得写前端代码测试,这是个令人头疼的问题. 那么我们如何测试自己的后端程序呢, 这就用到了一个工具: Postman. 界面介绍: 传参的介绍 1.普通传参, 也就…

世界环境绩效指数EPI数据集(2000-2022年)

环境绩效指数(EPI)是由耶鲁大学和哥伦比亚大学联合发布的一项综合指标,旨在衡量世界各国在可持续环境管理方面的表现。覆盖2000年至2022年,EPI通过分析各国在多个维度上的环境政策执行成效,包括空气质量、水资源管理、…

Fiddler工具 — Fiddler常用插件(Willow)

Fiddler已有的功能已经够我们日常工作中使用了,为了更好的扩展Fiddler,Fiddler也是支持一些插件的安装,也支持用户自己开发插件并安装。 Fiddler插件下载地址:https://www.telerik.com/fiddler/add-ons 1、Traific Difer插件 Tr…

计算机通识——01.进制转换

前言 学习资料来自 C训练以及CSDN各博主的博客整合而来,内容涵盖计算机通识内容:进制转换、信息单位、数据校验、多媒体基础参数、HTTP \ HTTPS协议、OSI七层模型、IP基础 \ IPv6、网络拓扑机构、域名解析、常用网络命令和端口、数据结构常识等内容&…

探讨TCP的可靠性以及三次握手的奥秘

🌟 欢迎来到 我的博客! 🌈 💡 探索未知, 分享知识 !💫 本文目录 1. TCP的可靠性机制1.2可靠性的基础上,尽可能得提高效率 2. TCP三次握手过程3. 为何不是四次握手? 在互联网的复杂世界中,TCP&am…

如何保存缓存和MySQL的双写一致呢?

如何保存缓存和MySQL的双写一致呢? 所谓的双写一致指的是,在同时使用缓存(如Redis)和数据库(如MySQL)的场景下,确保数据在缓存和数据库中的更新操作保持一致。当对数据进行修改的时候,无论是先修改缓存还是先修改数据库,最终都要保…

私域必备宝藏工具!让你轻松管理多个微信号

随着私域流量越来越受到重视,很多人手上都有着好几个微信,而一个手机最多只能登录两个微信,管理起来很是麻烦。 不过不用担心,微信管理系统可以帮助大家解决这个问题,让大家能够轻松管理多个微信号,提高私…

springCloudeAlibaba的使用

父pom文件&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.o…

学python新手如何安装pycharm;python小白如何安装pycharm

首先找到官网&#xff1a; Download PyCharm: The Python IDE for data science and web development by JetBrains 打开后选择下载&#xff0c;下图标红部分 点击exe程序&#xff0c;点击下一步&#xff01; 选择安装路径&#xff0c;下一步 弹出界面全选 选择默认 然后直接…

猜一猜“爵”在古代是哪种器具?2024年3月17日蚂蚁庄园今日答案

蚂蚁庄园是一款爱心公益游戏&#xff0c;用户可以通过喂养小鸡&#xff0c;产生鸡蛋&#xff0c;并通过捐赠鸡蛋参与公益项目。用户每日完成答题就可以领取鸡饲料&#xff0c;使用鸡饲料喂鸡之后&#xff0c;会可以获得鸡蛋&#xff0c;可以通过鸡蛋来进行爱心捐赠。其中&#…

CTF-希尔加解密

对于希尔加解密很多writeup都说用在线工具,所以研究了一下,写了一个方便的加解密python代码,根据给定的字母表及私钥字符串,尝试不同纬度不同重叠的加密矩阵输出加解密结果。运行效果如下: 代码文件Hill希尔加解密_final.py import numpy as np import string # 导入自定…

ArcGIS模型构建器Pro版_更多花活演示

相比较ArcMap的模型构建器&#xff0c;Pro里最主要的变化就是增加了一组逻辑工具&#xff1a; 逻辑工具用于控制模型中的流程流&#xff0c;它们返回的结果是true或false。 这个结果一般用于 if-else 分支逻辑&#xff0c;例如&#xff1a;如果某字段存在的时候&#xff0c;执…

从零开始学习编程:迈出你的编程之路

标题 《从零开始学习编程&#xff1a;迈出你的编程之路》摘要引言如何开始学习编程&#xff1f;1. **明确学习目标**2. **选择编程语言**3. **学习资源**4. **练习编程**5. **参与社区**6. **持之以恒**7. **探索更多** 总结参考资料 博主 默语带您 Go to New World. ✍ 个人主…

刷题DAY25 | LeetCode 216-组合总和III 17-电话号码的字母组合

216 组合总和III&#xff08;medium&#xff09; 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返回所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回。 …

unicloud update 修改

update 修改 使用腾讯云时更新方法必须搭配doc、where方法使用&#xff0c;db.collection(‘test’).update()会报如下错误&#xff1a;param should have required property ‘query’ collection.doc().update(Object data)未使用set、remove更新操作符的情况下&#xff0c…

计算机网络实训-2 网络设备配置基础

文章目录 一、交换机/路由器的内部组成二、接口类型及接口标识观察&#xff1a;交换机、路由器的外观交换机的接口标识交换机的接口标识举例 路由器的接口标识路由器的接口标识举例 三、配置交换机/路由器的方法通过Console口来配置&#xff08;带外管理&#xff09;通过telnet…

【vue baidu-map】实现百度地图展示基地,鼠标悬浮标注点展示详细信息

实现效果如下&#xff1a; 自用代码记录 <template><div class"map" style"position: relative;"><baidu-mapid"bjmap":scroll-wheel-zoom"true":auto-resize"true"ready"handler"><bm-mar…

XCTF:level0[WriteUP]

PWN入门题目&#xff1a;XCTF攻防世界的level0 使用file、checksec命令查看文件详细信息 这是一个64bit的ELF文件&#xff08;后面编写EXP需要用到&#xff09; 从checksec中展示的信息看&#xff0c;该二进制文件只开启了NX&#xff08;数据执行保护&#xff09; 这样的话就…

如何理解Linux文件IO?

一、文件IO的概述 1、什么是文件&#xff1f; Linux下一切皆文件。普通文件、目录文件、管道文件、套接字文件、链接文件、字符设备文件、块设备文件。 2、什么是IO&#xff1f; input output&#xff1a;输入输出 3、什么是文件IO&#xff1f; 对文件的输入输出&#xff0c;把…