【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) | 返回从 fromIndex 到 toIndex 的子列表 |
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 的特性,希望能帮助读者深入理解并灵活运用这一基础数据结构。