【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

动态规划(一)——思想入门

动态规划(一)——思想入门

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥✨✨✨✨✨✨ 个人主页✨✨✨✨✨✨         在前面,我们练习了很多不同类型的题目,这一篇博客,我们来看看算法中比较重要的知识点——动态规划~准备好了吗~我们发车啦~🚗🚗🚗🚗🚗🚗 目录 前置知识😝 第N个泰波那契数😍 使用最小花费爬楼梯😁 状态表示方法一 状态表示方法二 解码方法😜 常规解法 优化解法 前置知识😝         在正式开始动态规划的题目练习之前,我们来看看动态规划的一般步骤~ 一般步骤:  1、创建一个dp表,进行状态表示(状态表示就是dp表里面的值dp[i]有什么含义)         怎么得到状态表示呢?——一般是经验+题目要求 2、状态转移方程             dp[i]等于什么,怎么推导出dp[i] 3、初始化

By Ne0inhk
Flutter 三方库 matrix 鸿蒙终端底层复杂超维数学算力适配突破:无缝植入极限级张量系统与密集线性代数矩阵运算推演算法,解锁端侧图形处理边界-适配鸿蒙 HarmonyOS ohos

Flutter 三方库 matrix 鸿蒙终端底层复杂超维数学算力适配突破:无缝植入极限级张量系统与密集线性代数矩阵运算推演算法,解锁端侧图形处理边界-适配鸿蒙 HarmonyOS ohos

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 matrix 鸿蒙终端底层复杂超维数学算力适配突破:无缝植入极限级张量系统与密集线性代数矩阵运算推演算法,全面解锁端侧图形视觉处理边界并拔高数据分析算力上限 在图形学渲染、物理引擎模拟、复杂地理坐标转换以及端侧小型机器学习框架中,底层的矩阵运算(Matrix Operations)是决速步骤。matrix 库是一个专注于高性能线性代数计算的 Dart 库。本文将详解该库在 OpenHarmony 环境下的适配与实战应用。 封面 前言 什么是 matrix?它为 Dart 提供了一套类似于 NumPy 的多维数组运算接口。在鸿蒙操作系统这种强调极致流畅度和复杂视觉动效的系统中,利用高效的矩阵算法可以显著提升自定义 Canvas 绘图或实时传器数据处理的性能,避免因 Dart 层的低效循环导致的 UI 掉帧。 一、原理解析 1.1 基础概念 matrix 库核心基于

By Ne0inhk
Python连接和操作Elasticsearch详细指南

Python连接和操作Elasticsearch详细指南

Python连接和操作Elasticsearch详细指南 * 一、服务器端配置 * 1. 修改 Elasticsearch 配置文件 * 2. 开放防火墙端口 * 二、本地 Python 连接 Elasticsearch * 1. 连接 Elasticsearch * 2. 索引操作 * 3. 文档操作 * 4. 搜索内容 * 5. 聚合查询 * 6. 批量操作 * 三、注意事项 * 四、故障排除 * 结论 Elasticsearch 是一个强大的搜索引擎,广泛应用于数据存储和搜索场景。通过 Python,我们可以方便地与 Elasticsearch 进行交互。本文将详细介绍如何在本地使用 Python 连接到服务器上的 Elasticsearch,并进行基本的操作。 一、服务器端配置 在开始之前,确保你的 Elasticsearch

By Ne0inhk

如何用Qwen2.5做代码生成?0.5B模型Python调用详细步骤

如何用Qwen2.5做代码生成?0.5B模型Python调用详细步骤 1. 为什么选择Qwen2.5-0.5B做代码生成? 你是不是也遇到过这样的场景:写个脚本卡在某个函数上,查文档太慢,搜答案又一堆不相关的?或者只是想快速生成一段处理CSV的代码,但懒得从头敲?这时候,一个轻量、快速、能理解中文指令的AI助手就特别实用。 Qwen2.5-0.5B-Instruct 正是为此而生。它是通义千问Qwen2.5系列中最小的成员,只有约5亿参数,模型文件不到1GB,但它可不是“缩水版”。经过专门的指令微调,它对中文语境下的任务理解非常到位,尤其是像“写个Python函数来读取Excel并去重”这种具体需求,回答得很接地气。 最关键的是——它不需要GPU。你在一台普通的云服务器、甚至本地笔记本的CPU上就能跑起来,响应速度还很快。不像动辄几十GB显存的大模型,这个小家伙特别适合集成到工具链里,做自动化代码辅助。 我最近就在一个数据清洗项目里用它当“编程搭子”,每次要写重复逻辑时就丢一句“帮我写个函数,输入是字典列表,按某个字段去重”,几秒钟就出结果,改改变量名就能用,

By Ne0inhk