《令狐带你阅读JDK源码之简单集合ArrayList》

文章目录

    • Java简单集合
      • ArrayList
      • 继承体系
      • 源码解析
    • 总结

大家好哈,欢迎来到令狐小哥本期专栏,这期专栏主要是带着大家阅读JDK源码,我会分几期篇幅来介绍这个jdk源码、会进行剖析、梳理,欢迎大家指正阅读。后面我会配套自己的视频进行讲解~

Java简单集合

ArrayList

ArrayList是一种以数组实现的List,与数组相比,它具有动态扩展的能力,因此又被称为:动态数组。

继承体系

image-20240604155750153

ArrayList实现了List,Serializable,RandomAccess,Cloneable

  • ArrayList实现了List,提供了基础的添加,删除,遍历等操作。
  • ArrayList实现了Serializable,表示可以被序列化。
  • ArrayList实现了 Cloneable,可以被克隆。
  • ArrayList实现了RandomAccess,提供了随机访问的能力。

源码解析

/*** @Description: 源码阅读:Codelinghu* @param null* @return:* @Author: codelinghu* @Date: 2024/6/4*/public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{private static final long serialVersionUID = 8683452581122892189L;/*** ArrayList默认的容量为10* default_capacity*/private static final int DEFAULT_CAPACITY = 10;/*** 空数组,如果传入的容量为0的时候使用,* 当new ArrayList(0)的时候使用它** empty_elementdata*/private static final Object[] EMPTY_ELEMENTDATA = {};/**当new ArrayList()的时候使用它,使用这个空数组defaultcapacity_empty_elementdata*/private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};/**存储元素的数组*/transient Object[] elementData; // non-private to simplify nested class access/***集合中元素的个数*/private int size;public ArrayList(int initialCapacity) {if (initialCapacity > 0) {//如果初始化容量大于0,新建一个数组存储元素this.elementData = new Object[initialCapacity];} else if (initialCapacity == 0) {//如果初始化容量等于0,使用空数组EMPTY_ELEMENTDATAthis.elementData = EMPTY_ELEMENTDATA;} else {//如果初始化容量小于0,抛出异常throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);}}/*** 无参构造,new ArrayList()的情况*/public ArrayList() {//如果不传初始容量,初始化为DEFAULTCAPACITY_EMPTY_ELEMENTDATA空数组,会在添加//第一个元素的时候扩容为默认的大小,10.this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;}/**这个构造器会传入一个集合C,这里会使用传入集合的元素拷贝到elementData数组中*/public ArrayList(Collection<? extends E> c) {elementData = c.toArray();if ((size = elementData.length) != 0) {// c.toArray might (incorrectly) not return Object[] (see 6260652)/**如果elementData的类型不是Object[],则使用Arrays.copyOf()方法将elementData复制到一个新的Object[]类型的数组中。这样做的目的是确保elementData的类型是Object[],避免类型不匹配的问题。* @Author: codelinghu* @Date: 2024/6/4*/if (elementData.getClass() != Object[].class)elementData = Arrays.copyOf(elementData, size, Object[].class);// elementData复制到一个新的Object[]类型的数组中。这样做的目的是确保elementData的类型是Object[],避免类型不匹配的问题。} else {// 传入元素个数为0的时候replace with empty array.this.elementData = EMPTY_ELEMENTDATA;}}public void ensureCapacity(int minCapacity) {int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)// any size if not default element table? 0// larger than default for default empty table. It's already// supposed to be at default size.: DEFAULT_CAPACITY;if (minCapacity > minExpand) {ensureExplicitCapacity(minCapacity);}}//计算最小容量private static int calculateCapacity(Object[] elementData, int minCapacity) {if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {//最小也得为10,避免容量过小导致频繁扩容return Math.max(DEFAULT_CAPACITY, minCapacity);}return minCapacity;}//检查是否需要扩容private void ensureCapacityInternal(int minCapacity) {//首先调用calculateCapacity(elementData, minCapacity)最小容量//然后调用ensureExplicitCapacity()进行扩容~ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));}//传递最小容量过来,进行扩容~private void ensureExplicitCapacity(int minCapacity) {/**首先将modCount加1,表示数组结构发生了变化。然后判断minCapacity - elementData.length > 0,如果为真,说明需要扩容,调用grow(minCapacity)方法进行扩容。*/modCount++;// overflow-conscious codeif (minCapacity - elementData.length > 0)//目前数组需要的容量大于当前的容量大小grow(minCapacity);//说明需要扩容}/*** The maximum size of array to allocate.* Some VMs reserve some header words in an array.* Attempts to allocate larger arrays may result in* OutOfMemoryError: Requested array size exceeds VM limit*/private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;/**数组扩容方法growminCapacity为需要的容量*/private void grow(int minCapacity) {// overflow-conscious codeint oldCapacity = elementData.length;//新容量为旧容量的1.5倍int newCapacity = oldCapacity + (oldCapacity >> 1);//如果新容量小于需要的容量,则以需要的容量为准!if (newCapacity - minCapacity < 0)newCapacity = minCapacity;//如果新容量超过了最大的容量,则使用最大的容量if (newCapacity - MAX_ARRAY_SIZE > 0)//hugeCapacity(minCapacity)方法用于计算ArrayList的最大容量newCapacity = hugeCapacity(minCapacity);// 以新容量拷贝出一个新数组/**将原数组(elementData)的内容复制到一个新数组中,并确保新数组的容量(newCapacity)足够容纳更多的元素。这样,当向ArrayList添加更多元素时,就不需要频繁地进行扩容操作,* @Author: codelinghu* @Date: 2024/6/5*/elementData = Arrays.copyOf(elementData, newCapacity);}//计算ArrayList的最大容量private static int hugeCapacity(int minCapacity) {if (minCapacity < 0) // overflowthrow new OutOfMemoryError();return (minCapacity > MAX_ARRAY_SIZE) ?Integer.MAX_VALUE :MAX_ARRAY_SIZE;}/*** Returns the element at the specified position in this list.*获取指定元素位置的元素*/public E get(int index) {//检查是否越界rangeCheck(index);//返回指定元素return elementData(index);}
}

总结

  • ArrayList内部使用的是数组存储元素,当数组长度不够进行扩容的时候,每次加一半的空间,ArrayList不会进行缩容。
  • ArrayList支持随机访问,通过索引访问元素极快、删除元素极快,但是删除中间元素比较慢,添加元素到中间也比较慢。
  • ArrayList支持求并集、交集、单向差集。

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

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

相关文章

计算机网络 期末复习(谢希仁版本)第2章

物理层考虑的是怎样才能在连接各种计算机的传输媒体上传输数据比特流&#xff0c;而不是指具体的传输媒体。4 个特性&#xff1a; 机械特性&#xff1a;指明接口所用接线器的形状和尺寸、引线数目和排列、固定和锁定装置等。 电气特性&#xff1a;指明在接口电缆的各条线上出现…

【python进阶】python图形化编程之美--tkinter模块初探

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

白酒:茅台镇白酒的地域特色与环境优势

茅台镇&#xff0c;位于中国贵州省仁怀市&#xff0c;因其与众不同的自然环境和酿酒工艺而成为世界著名的白酒产区。作为茅台镇的品牌&#xff0c;云仓酒庄豪迈白酒以其卓着的品质和口感赢得了广大消费者的喜爱。而这一切&#xff0c;都离不开茅台镇的地域特色和环境优势。 茅台…

构建LangChain应用程序的示例代码:20、使用LangChain的SQLDatabase包装器连接到Databricks运行时并执行查询操作教程

Databricks SQL 数据库连接 概述 这个笔记本介绍了如何使用LangChain的SQLDatabase包装器连接到Databricks运行时和Databricks SQL。 内容分为三个部分&#xff1a;安装和设置、连接到Databricks以及示例。 安装和设置 !pip install databricks-sql-connector # 安装Datab…

Python 知识图谱补全,Knowledge Graph Completion,基于大模型的知识图谱补全,基于LLMs的KGC任务

今天讲一篇文章《Exploring Large Language Models for Knowledge Graph Completion》 &#xff0c;这篇文章主题&#xff1a;基于大模型做知识图谱补全 1.文章主要思想&#xff1a; 本章描述知识图谱补全中的三个任务&#xff1a;三元组分类、关系预测和实体(链接)预测&…

C++初阶学习第十一弹——探索STL奥秘(六)——深度刨析list的用法和核心点

前言&#xff1a; 在前面&#xff0c;我们已经学习了STL中的string和vector&#xff0c;现在就来讲解STL中的最后一个部分——list的使用及其相关知识点&#xff0c;先说明一点&#xff0c;因为我们之前已经讲过了string和vector的接口函数等用法&#xff0c;list的这些用法与它…

python_将二维列表转换成HTML格式_邮件相关

python_将二维列表转换成HTML_邮件相关 data[["理想","2"],["理想2","3"]]def list_to_html_table(data):"""将二维列表转换为HTML表格格式的字符串。参数:data -- 二维列表&#xff0c;表示表格的数据。返回:一个字符…

vue2 集成element 步骤

要在Vue2中集成Element UI&#xff0c;可以按照以下步骤进行操作&#xff1a; 安装Element UI库&#xff1a; 在项目的根目录下使用以下命令安装Element UI&#xff1a; npm install element-ui --save在main.js中引入Element UI库&#xff1a; 在项目的src/main.js文件中添加以…

3-Maven-plugins配置

3-Maven-plugins配置 plugins的作用是定义 Maven 插件&#xff0c; plugins 主要用于扩展 Maven 的功能&#xff0c;帮助开发人员更方便地构建、打包、发布项目。插件可以通过 Maven 的插件中心或者自己构建的私有仓库来使用&#xff0c;能在构建过程中执行特定的任务&#xf…

美财长耶伦警告:金融行业广泛应用AI带来潜在“重大风险”

内容概述 耶伦承认&#xff0c;人工智能用在金融领域可降低交易成本、提高效率、检测欺诈和增加服务可及性&#xff0c;但也伴随风险。AI模型的复杂性和不透明度、供应商高度集中、产生数据缺陷或偏见等AI相关风险&#xff0c;已成为美国金融监管机构的首要议题。 6月6日周四&…

2024年全国青少信息素养大赛图形化编程挑战赛集训第一天编程题分享

大家如果不想阅读前边的比赛内容介绍,可以直接跳过:拉到底部看集训第一天题目 (一)比赛内容: 【小学低年级组】 1、图形化编程软件的使用:熟悉图形化编程软件中舞台区、角色列表区、功能区、脚本编 -3- 辑区的功能及使用。 2、基础功能模块的使用: a.运动模块:角…

Spring Boot 开发 -- 集成 Prometheus 进行高效监控

引言 随着微服务架构的流行&#xff0c;对服务的监控和管理变得尤为重要。Prometheus作为一个开源的监控和告警工具&#xff0c;以其强大的数据采集、存储和查询能力&#xff0c;受到了众多开发者的青睐。Spring Boot作为Java领域快速构建微服务的框架&#xff0c;与Prometheu…

linux c 求取MD5 转char 输出

要将MD5摘要转换为可打印的十六进制字符串&#xff08;char数组&#xff09;&#xff0c;可以使用sprintf函数来实现。以下是修改后的代码&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/md5.h>void ca…

单轮对话和多轮对话

参考&#xff1a;数据集对应关系说明 - 千帆大模型平台 | 百度智能云文档 (baidu.com) 什么是单轮对话 单轮对话和多轮对话是两种不同的对话形式&#xff0c;它们分别指的是在一次对话中只涉及一个问题和对应的回答&#xff0c;以及在一次对话中涉及多个问题和对应的回答。 …

暑假打工兼职首选——千行赏金

考虑暑假打工兼职该怎么选&#xff1f;加入千行赏金这样的平台确实是一个值得考虑的选择。以下是一些关于此问题的分析&#xff1a; 首先&#xff0c;暑假打工兼职的好处是显而易见的。它不仅可以为学生提供一定的经济收入&#xff0c;减轻家庭的经济负担&#xff0c;还可以帮…

【教程】从0开始搭建大语言模型:文本预处理

从0开始搭建大语言模型&#xff1a;文本预处理 参考仓库&#xff1a;LLMs-from-scratch 理解Word embedding 深度神经网络模型&#xff0c;包括LLM&#xff0c;不能直接处理原始文本&#xff0c;因此需要一种方法将它转换为连续值的向量&#xff0c;也就是embedding。如下图…

深入理解 Spring Boot 启动原理

本文将从以下几个方面进行详细阐述&#xff1a; Spring Boot 启动过程概述BeanFactory 初始化Bean 的实例化和依赖注入Aware 接口的设置Bean 的初始化单例 Bean 的后处理Spring 启动后的后处理启动 HTTP 流量入口 一、Spring Boot 启动过程概述 Spring Boot 的启动过程可以分…

长轮询之websocket

官方文档 背景 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它是为了解决 HTTP 协议存在的一些问题而产生的。WebSocket 的产生背景主要包括以下几点: HTTP 协议的局限性 HTTP 协议是一种请求-响应模型,客户端发起请求,服务端返回响应。这种模型存在一些问题,如…

等级保护测评与风险评估:构建网络安全的双重保障

# 等级保护测评与风险评估&#xff1a;构建网络安全的双重保障 在网络信息技术飞速发展的今天&#xff0c;网络安全问题日益成为社会关注的焦点。等级保护测评和风险评估作为网络安全管理的两个重要环节&#xff0c;对于确保信息系统的安全稳定运行具有重要意义。本文将探讨等级…

Stage #15深度解析:十六进制编码在XSS绕过中的应用

Stage #15深度解析&#xff1a;十六进制编码在XSS绕过中的应用 在网络安全领域&#xff0c;跨站脚本攻击&#xff08;XSS&#xff09;是一种常见的网络攻击手段。随着Web应用安全防护措施的不断完善&#xff0c;攻击者需要更高级的技术来绕过这些防护。本文将详细介绍如何利用…