【Java ArrayList】从入门到精通:从概念,使用到扩容机制,一篇带你掌握Java动态数组核心

【Java ArrayList】从入门到精通:从概念,使用到扩容机制,一篇带你掌握Java动态数组核心
在这里插入图片描述
🎁个人主页:User_芊芊君子
🎉欢迎大家点赞👍评论📝收藏⭐文章
🔍系列专栏:Java.数据结构
在这里插入图片描述


在这里插入图片描述


【前言】

ArrayList 是 Java 集合框架(Java Collections Framework)中最常用的动态数组实现,它提供了灵活的容量管理、便捷的增删改查操作,广泛应用于日常开发中。本文将深入剖析 ArrayList 的底层结构、核心方法源码、性能特点及最佳实践,帮助读者彻底掌握这一基础数据结构。

文章目录:

一、ArrayList的概念

ArrayList基于动态数组实现,底层维护一个Object[ ]数组,elementDate存储元素,同时通过size变量记录当前有效元素个数,容量可自动扩容。它实现了List接口,如下图:

在这里插入图片描述
ArrayList是以泛型方式实现,使用时必须实例化;ArrayList实现RandomAccess接口,ArrayList可随机访问;ArrayList实现Cloneable接口,ArrayList可以克隆;ArrayList实现Serializable接口,支持序列化;ArrayList不是线程安全,在单线程下可以使用在多线程中可以选择Vector或者CopyOnWriteArrayList;ArrayList底层是一段连续的空间,可以自动扩容,是一个动态类型的顺序表

二、ArrayList的使用

1.构造ArrayList

ArrayList提供三种构造函数:

方法说明
ArrayList()无参构造
ArrayList(Collection<? extends E> c)利用其他Collection构建ArrayList
ArrayList(int initialCapacity)指定顺序表初始容量

1.1 无参构造方法

publicstaticvoidmain(String[] args){//创建一个空的ArrayListArrayList<Integer> list =newArrayList<>(); list.add(1); list.add(2); list.add(3);System.out.println(list);}

【源码:】

在这里插入图片描述

1. 2 带有初始容量的构造方法

//创建一个有初始容量的ArrayListArrayList<Integer> list2 =newArrayList<>(5); list2.add(22); list2.add(33); list2.add(44);System.out.println(list2);

【源码:】

在这里插入图片描述

1.3 用其他集合类构造ArrayList

类型一定是实现了Collection接口传的参数要是E或E的子类
//创建一个有初始容量的ArrayListArrayList<Integer> list2 =newArrayList<>(5); list2.add(22); list2.add(33); list2.add(44);System.out.println(list2);//都是Integer类型,可以传ArrayList<Integer> list3 =newArrayList<>(list2);

【源码:】

在这里插入图片描述

2.操作方法

方法签名描述
boolean add(E e)将元素 e 插入到列表末尾
void add(int index, E element)将元素 e 插入到指定的 index 位置
boolean addAll(Collection<? extends E> c)将集合 c 中的所有元素插入到列表末尾
E remove(int index)删除并返回指定 index 位置的元素
boolean remove(Object o)删除列表中第一个遇到的元素 o
E get(int index)获取指定 index 位置的元素
E set(int index, E element)将指定 index 位置的元素替换为 element
void clear()清空列表中的所有元素
boolean contains(Object o)判断列表中是否包含元素 o
int indexOf(Object o)返回第一个匹配元素 o 的索引
int lastIndexOf(Object o)返回最后一个匹配元素 o 的索引
List<E> subList(int fromIndex, int toIndex)返回从 fromIndextoIndex 的子列表

2.1 boolean add(E e):尾插e

//创建一个空的ArrayListArrayList<Integer> list =newArrayList<>();//末尾插入1 list.add(1);System.out.println(list);

2.2 void add(int index,E element):将e插入index位置

//创建一个空的ArrayListArrayList<Integer> list =newArrayList<>();//0位置插入1 list.add(0,1);System.out.println(list);

2.3 boolean addAll(Collection<?extends E>c):尾插c中的元素

//创建一个空的ArrayListArrayList<Integer> list =newArrayList<>();//0位置插入1 list.add(1); list.add(11); list.add(111);System.out.println(list);ArrayList<Integer> list2 =newArrayList<>(); list2.addAll(list); list2.add(1111);System.out.println(list2);
在这里插入图片描述

2.4 E remove(int index/Object o)

//创建一个空的ArrayListArrayList<Integer> list =newArrayList<>();//0位置插入1 list.add(1); list.add(11); list.add(111);System.out.println(list); list.remove(2);//下标//对象 list.remove(newInteger(2));Integer x =2;//写法2 list.remove(x);

2.4 ListsubList(int fromIndex,int toIndex):截取list部分

//创建一个空的ArrayListArrayList<Integer> list =newArrayList<>();//0位置插入1 list.add(1); list.add(11); list.add(111); list.add(1111);System.out.println(list);List<Integer> subList = list.subList(1,3);System.out.println(subList);
它的截取是左闭右开,截取1~3位置,取2,3后面如果修改元素,截取的也会随之修改,实际截取的是地址
在这里插入图片描述

一些简单的方法就不一一列举了,直接调用就行,具体的方法实现可以看这篇【Java ArrayList】底层方法的自我实现

三、ArrayList的遍历

1.for循环遍历

for(int i =0; i < list.size(); i++){Integer a = list.get(i);System.out.println(a+" ");}

2.增强型for循环

for(int x : list){System.out.println(x+" ");}

3.迭代器

只要实现Iterable接口,都可以使用迭代器打印
it.next():访问下一个,it望后走一步

Iterator<Integer> it = list.iterator();while(it.hasNext()){System.out.println(it.next()+" ");}

从指定位置开始打印

//可以从指定位置开始打印ListIterator<Integer> it2 = list.listIterator(2);while(it2.hasNext()){System.out.println(it2.next()+" ");}

逆向打印

ListIterator<Integer> it = list.listIterator(list.size());while(it.hasPrevious()){System.out.println(it.previous()+" ");}

四、ArrayList扩容机制

ArrayList是⼀个动态类型的顺序表,在插⼊元素的过程中会⾃动扩容。

如果调⽤不带参数的构造⽅法,第⼀次分配数组⼤⼩为10后续扩容为1.5倍扩容

源码如下:

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

【总结】

ArrayList 是基于动态数组的 List 实现,具有随机访问快、使用便捷的特点,适合大多数读多写少的场景。本文从底层原理、核心方法、性能分析到注意事项,全面剖析了 ArrayList 的特性,希望能帮助读者深入理解并灵活运用这一基础数据结构。

Read more

Java 部署:Jenkins Pipeline 构建 Java 项目(自动化)

Java 部署:Jenkins Pipeline 构建 Java 项目(自动化)

👋 大家好,欢迎来到我的技术博客! 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕Java部署这个话题展开,希望能为你带来一些启发或实用的参考。 🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获! 文章目录 * Java 部署:Jenkins Pipeline 构建 Java 项目(自动化) 🚀 * 为什么选择 Jenkins Pipeline?🔧 * 环境准备:搭建 Jenkins 服务器 ⚙️ * 使用 Docker 快速启动 Jenkins * 安装必要插件 * 示例 Java 项目:一个简单的 Spring Boot 应用 🌱 * 项目结构 * `pom.xml` * `DemoApplication.java` * `HelloController.java` * 单元测试(可选但推荐) * 编写 Jenkins

By Ne0inhk
Java 大视界 -- Java 大数据在新能源微电网能量优化调度与虚拟电厂协同控制中的应用实践(282)

Java 大视界 -- Java 大数据在新能源微电网能量优化调度与虚拟电厂协同控制中的应用实践(282)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也期待你毫无保留地分享独特见解,愿我们于此携手成长,共赴新程!💖 本博客的精华专栏: 【大数据新视界】 【Java 大视界】 【智创 AI 新视界】 【Java+Python 双剑合璧:AI 大数据实战通关秘籍】 社区:【青云交技术变现副业福利商务圈】和【架构师社区】的精华频道: 【福利社群】 【今日看点】 【今日精品佳作】 【每日成长记录】 Java 大视界 -- Java 大数据在新能源微电网能量优化调度与虚拟电厂协同控制中的应用实践(282) * 引言: * 正文: * 一、新能源微电网技术架构与 Java 基座 * 1.1 微电网控制的

By Ne0inhk
OpenClaw 刚配好就完了?5 步调教,让你的 AI 助手真正“能干活”

OpenClaw 刚配好就完了?5 步调教,让你的 AI 助手真正“能干活”

很多人装完 OpenClaw,接上 Discord 或 Telegram,发现能聊天了就觉得“搞定了”。 但我自己踩坑一圈后,越来越确定一件事:默认状态的 OpenClaw,可能只发挥了 20% 的能力。剩下的 80%,藏在一些你没太注意的配置文件里——而且改起来并不难。 下面我按“收益从高到低”的顺序,把我自己最有效的 5 步调教方法整理出来。新手照着做,大概率能立刻感受到差别。 默认状态 vs 调教后:差别到底在哪? 先给你一个直观对比,方便建立预期: 项目默认状态调教后回复风格客服味:“我很乐意帮助您!”更像懂你的搭档记忆每次对话都像陌生人记得你们之前聊过什么能力只能聊天能下载视频、查股票、做 PPT、巡检服务器…主动性你不说它不动会定期检查状态,主动提醒成本/效率所有任务都用同一个模型复杂任务用强模型,简单活用便宜模型 如果你只做一件事:先把第 1 步和第 2 步做了,

By Ne0inhk

Cloudflare AI Gateway + Google AI Studio 保姆级配置指南(含API Key安全使用技巧)

Cloudflare AI Gateway + Google AI Studio 保姆级配置指南(含API Key安全使用技巧) 最近在折腾几个AI应用项目,发现直接把Google AI Studio的API Key写在前端代码里,或者硬编码在服务器配置文件中,心里总是不太踏实。一次偶然的代码仓库公开事件,让我彻底警醒——API Key泄露的风险远比想象中来得快。于是,我开始寻找既能享受Gemini强大模型能力,又能确保密钥安全的解决方案。Cloudflare AI Gateway进入了我的视野,它不仅仅是一个简单的代理,更像是一个功能丰富的API流量管理器和安全哨兵。 对于中高级开发者来说,单纯“能用”已经不够了。我们需要的是在生产环境中,既能保障服务稳定性,又能对成本、安全性和性能有精细把控的方案。将Google AI Studio与Cloudflare AI Gateway集成,正是为了满足这种需求。它允许你通过一个统一的网关入口调用Gemini模型,同时将敏感的API Key隐藏在Cloudflare的安全边界之后,前端或客户端只需与网关通信,从根本上切断了密钥直接暴露的路

By Ne0inhk