当前位置: 首页 > news >正文

Java ArrayList 完整详解

Java ArrayList 完整详解

一、概述

ArrayListjava.util包下基于动态数组实现的 List 集合,底层是 Object[] 数组,自动扩容,支持随机访问、增删改查。

  • 线程不安全,多线程并发修改会抛ConcurrentModificationException
  • 允许存放null,元素可重复、有序(插入顺序不变)
  • 查询快、中间/头部删除插入慢(需要数组移位)

类关系

ArrayList<E>extendsAbstractList<E>implementsList<E>,RandomAccess,Cloneable,Serializable

RandomAccess标记接口:支持下标快速随机访问,遍历优先用普通for循环。

二、底层原理

  1. 默认初始容量DEFAULT_CAPACITY = 10
  2. 空构造器先赋值空数组,第一次add时才扩容到10,节省内存
  3. 扩容机制
    • 新容量 = 旧容量 + 旧容量 / 2(1.5倍扩容)
    • 若1.5倍仍不够,直接取所需最小容量
    • 最大容量:Integer.MAX_VALUE - 8
  4. 增删操作:数组复制Arrays.copyOf(),移位消耗性能

三、常用构造方法

// 1. 空构造,初始数组为空,首次add扩容至10ArrayList<String>list1=newArrayList<>();// 2. 指定初始容量(推荐已知数据量时使用,减少扩容)ArrayList<Integer>list2=newArrayList<>(20);// 3. 传入集合,复制所有元素List<Integer>temp=Arrays.asList(1,2,3);ArrayList<Integer>list3=newArrayList<>(temp);

四、核心常用API

1. 添加元素

ArrayList<String>list=newArrayList<>();list.add("A");// 尾部添加list.add(1,"B");// 指定下标插入(下标不能越界)list.addAll(Arrays.asList("C","D"));// 批量添加集合

2. 获取元素

Strings=list.get(0);// 根据下标取值,越界抛IndexOutOfBoundsExceptionintsize=list.size();// 获取集合元素个数

3. 修改元素

list.set(0,"AA");// 替换指定下标元素,返回旧值

4. 删除元素

list.remove(0);// 按下标删除,返回被删元素list.remove("B");// 按对象删除,只删第一个匹配元素,返回booleanlist.removeAll(Arrays.asList("C","D"));// 删除交集元素list.clear();// 清空所有元素,数组保留容量

5. 判断与查找

list.contains("A");// 是否包含元素list.indexOf("A");// 首个匹配下标,无则-1list.lastIndexOf("A");// 最后一个匹配下标list.isEmpty();// 是否为空集合

6. 转换数组

Object[]arr1=list.toArray();String[]arr2=list.toArray(newString[0]);// 转指定类型数组

五、三种遍历方式

1. 普通for(推荐,随机访问最快)

for(inti=0;i<list.size();i++){System.out.println(list.get(i));}

2. 增强for循环(foreach,底层迭代器)

for(Stringstr:list){System.out.println(str);}

3. Iterator迭代器(遍历中安全删除)

Iterator<String>it=list.iterator();while(it.hasNext()){Strings=it.next();if("A".equals(s)){it.remove();// 安全删除,不会并发修改异常}}

❌ 禁止foreach里直接list.remove(),会触发并发修改异常。

六、线程安全问题

ArrayList非线程安全,多线程同时读写会报错或数据错乱。

解决方案

  1. Vector:旧集合,方法全加synchronized,性能差,不推荐
  2. Collections.synchronizedList():包装成同步集合
List<String>safeList=Collections.synchronizedList(newArrayList<>());
  1. CopyOnWriteArrayList:读写分离,读不加锁,写复制新数组,读多写少场景首选

七、常用示例代码

importjava.util.ArrayList;importjava.util.Arrays;publicclassArrayListDemo{publicstaticvoidmain(String[]args){ArrayList<Integer>nums=newArrayList<>();// 添加nums.add(10);nums.add(20);nums.add(30);nums.add(1,15);// 查询System.out.println(nums.get(1));// 15System.out.println(nums.size());// 4// 修改nums.set(0,99);// 删除nums.remove(Integer.valueOf(30));// 遍历for(Integernum:nums){System.out.print(num+" ");}}}

八、ArrayList vs LinkedList

特性ArrayListLinkedList
底层动态数组双向链表
查询快 O(1)慢 O(n)
头尾增删尾部快,头部慢头尾极快 O(1)
内存连续数组,占用少每个节点存前后指针,开销大
适用场景大量查询、少量删除频繁头部/中间插入删除

九、常见坑

  1. 下标越界get(i)add(i,obj)i >= size 抛异常
  2. foreach遍历中调用list.remove()→ ConcurrentModificationException,要用迭代器删除
  3. Arrays.asList()返回的集合不能add/remove,底层固定数组,需套new ArrayList<>()
  4. 存储基础类型会自动装箱成包装类(int→Integer)
  5. 扩容会产生大量数组复制,大数据初始化建议指定容量
http://www.gsyq.cn/news/1598141.html

相关文章:

  • 从“凌特杯”赛题出发:构建基于软件无线电的数字音频通信系统实战指南
  • 对偶上升法:从拉格朗日松弛到分布式优化的梯度之路
  • GetQzonehistory:一键找回丢失的QQ空间青春记忆完整指南
  • 解锁1490款PS4游戏:GoldHEN金手指管理器的终极体验
  • 67.等待与回响
  • Echarts Graph关系图实战:从零构建动态企业关系网络
  • 终极星露谷物语农场规划器:打造完美虚拟农场的完整指南
  • 终极跨平台体验:PiliPlus B站客户端完全使用指南
  • ANSYS Mechanical边界条件实战:从惯性载荷到热载荷的完整定义与应用
  • 战斗部毁伤评估:基于Gurney与Shapiro公式的破片飞散矢量仿真
  • 伊春黄金白银回收铂金旧金回收无套路门店 TOP 榜单 实地测评资料整理
  • 【Unity3D性能调优】Quality设置实战:从参数解析到多平台适配策略
  • 跨平台网盘直链下载助手:一键获取八大网盘真实下载地址的终极解决方案
  • 烟台黄金白银回收铂金旧金回收无套路门店 TOP 榜单 实地测评资料整理
  • Mellanox网卡固件与驱动一站式管理:MFT与mlxup实战解析
  • 【实战】基于STM32与Marvell 88W8782/88W8801的嵌入式WiFi网关:lwIP 2.1.3 HTTP服务器搭建与双模网络配置
  • BetterNCM安装器终极指南:5分钟解锁网易云音乐插件生态
  • Tessent ATPG进阶:解锁多种Fault Model的工程实践与选型指南
  • 从NOIP接水问题到多线程任务调度:模拟算法的实战解析
  • Navicat Premium试用重置:如何快速恢复14天免费试用期
  • 驻马店律师事务所亲测对比2026
  • PCB走线宽度实战指南:从理论公式到生产成本的平衡艺术
  • 从时序到数据:DHT11与DHT22在STM32上的精准驱动与避坑指南
  • Nexys4 DDR开发(一)--从零搭建Vivado工程与硬件验证
  • 移动通信信道挑战:从多径、多普勒到阴影与衰落的实战解析
  • 应广FPS122单片机单线UART驱动TM1652 LED屏实战解析
  • Flutter编译卡在‘assembleDebug’?从Gradle下载到镜像配置的完整排障指南
  • 同城外卖系统架构设计:从下单、调度到履约的全链路拆解
  • ADS1115硬件接口设计与驱动移植实战
  • Qt之SVG:从渲染到生成,构建现代化矢量图形界面