【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

DeepSeek-R1是真码农福音?我们问了100位开发者……

DeepSeek-R1是真码农福音?我们问了100位开发者……

从GitHub Copilot到DeepSeek-R1,AI编程工具正在引发一场"效率革命",开发者们对这些工具的期待与质疑并存。据Gartner预测,到2028年,将有75%的企业软件工程师使用AI代码助手。 眼看着今年国产选手DeepSeek-R1凭借“深度思考”能力杀入战场,它究竟是真码农福音还是需要打补丁的"潜力股"? ZEEKLOG问卷调研了社区内来自全栈开发、算法工程师、数据工程师、前端、后端等多个技术方向的100位开发者(截止到2月25日),聚焦DeepSeek-R1的代码生成效果、编写效率、语法支持、IDE集成、复杂代码处理等多个维度,一探DeepSeek-R1的开发提效能力。 代码生成效果:有成效但仍需提升 * 代码匹配比例差强人意 在代码生成与实际需求的匹配方面,大部分开发者(58人)遇到生成代码与实际需求完全匹配无需修改的比例在40%-70%区间,12人遇到代码匹配比例在70%-100%这样较高的区间。 然而,有30人代码匹配比例低于40%。这说明DeepSeek-R1在代码生成方面有一定效果,但在部分复杂或特定场景下,仍有很大的提升空间。

By Ne0inhk
AI+游戏开发:如何用 DeepSeek 打造高性能贪吃蛇游戏

AI+游戏开发:如何用 DeepSeek 打造高性能贪吃蛇游戏

文章目录 * 一、技术选型与准备 * 1.1 传统开发 vs AI生成 * 1.2 环境搭建与工具选择 * 1.3 DeepSeek API 初步体验 * 二、贪吃蛇游戏基础实现 * 2.1 游戏结构设计 * 2.2 初始化游戏 * 2.3 DeepSeek 生成核心逻辑 * 三、游戏功能扩展 * 3.1 多人联机模式 * 3.2 游戏难度动态调整 * 3.3 游戏本地保存与回放 * 3.4 跨平台移植 * 《Vue.js项目开发全程实录/软件项目开发全程实录》 * 编辑推荐 * 内容简介 * 作者简介 * 目录 一、

By Ne0inhk
[DeepSeek] 入门详细指南(上)

[DeepSeek] 入门详细指南(上)

前言 今天的是 zty 写DeepSeek的第1篇文章,这个系列我也不知道能更多久,大约是一周一更吧,然后跟C++的知识详解换着更。 来冲个100赞兄弟们 最近啊,浙江出现了一匹AI界的黑马——DeepSeek。这个名字可能对很多人来说还比较陌生,但它已经在全球范围内引发了巨大的关注,甚至让一些科技巨头感到了压力。简单来说这 DeepSeek足以改变世界格局                                                   先   赞   后   看    养   成   习   惯  众所周知,一篇文章需要一个头图                                                   先   赞   后   看    养   成   习   惯   上面那行字怎么读呢,让大家来跟我一起读一遍吧,先~赞~后~看~养~成~习~惯~ 想要 DeepSeek从入门到精通.pdf 文件的加这个企鹅群:953793685(

By Ne0inhk
DeepFace深度学习库+OpenCV实现——情绪分析器

DeepFace深度学习库+OpenCV实现——情绪分析器

目录 应用场景 实现组件 1. 硬件组件 2. 软件库与依赖 3. 功能模块 代码详解(实现思路) 导入必要的库 打开摄像头并初始化变量 主循环 FPS计算 情绪分析及结果展示 显示FPS和图像 退出条件 编辑 完整代码 效果展示 自然的 开心的 伤心的 恐惧的 惊讶的  效果展示 自然的 开心的 伤心的 恐惧的 惊讶的   应用场景         应用场景比较广泛,尤其是在需要了解和分析人类情感反应的场合。: 1. 心理健康评估:在心理健康领域,可以通过长期监控和分析一个人的情绪变化来辅助医生进行诊断或治疗效果评估。 2. 用户体验研究:在产品设计、广告制作或网站开发过程中,通过观察用户在使用过程中的情绪反应,来优化产品的用户体验。 3. 互动娱乐:在游戏或虚拟现实应用中,根据玩家的情绪状态动态调整游戏难度或故事情节,以增加沉浸感和互动性。

By Ne0inhk