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

10. JavaArrayList 核心笔记

一、集合与数组对比

ArrayList 是基于数组实现的动态集合类,底层为Object[],通过自动扩容机制解决数组长度固定的局限。

对比维度数组(Array)ArrayList
长度固定,定义后不可变可变,自动扩容
存储类型基本数据类型 + 引用数据类型仅引用数据类型;基本类型需包装类(自动装箱)
内置方法length属性add()/remove()/get()/set()/size()
泛型支持不支持支持(如ArrayList<String>
语法int[] arr = new int[5];ArrayList<Integer> list = new ArrayList<>();

使用场景选择:

场景数组ArrayList
元素数量固定、追求极致性能适用不适用
元素数量不确定、频繁增删不适用适用
存储基本数据类型适用需装箱
快速遍历与查找推荐(方法更丰富)

二、ArrayList 核心成员方法

方法签名说明返回值
boolean add(E e)向集合末尾添加元素固定返回true
boolean remove(E e)删除第一个匹配的指定元素成功true,失败false
E remove(int index)删除指定索引处的元素返回被删除的元素
E set(int index, E e)修改指定索引处的元素返回被替换的原元素
E get(int index)获取指定索引处的元素返回对应元素
int size()获取集合中有效元素个数(非底层容量)元素数量

三、底层实现原理

  1. 初始容量:创建ArrayList时,默认构造一个长度为 10 的Object[]数组。
  2. 自动扩容:当元素数量达到容量上限时,自动创建更大的数组(默认扩容至原容量的 1.5 倍),将原数组元素复制到新数组。
  3. 封装机制add()/get()/remove()等方法底层均操作该Object[]数组,对使用者透明。

四、基础使用示例

// 1. 创建 ArrayList(指定泛型) ArrayList<String> list = new ArrayList<>(); // 2. 添加元素(自动扩容) list.add("张三"); list.add("李四"); list.add("王五"); // 3. 获取元素 String name = list.get(1); // 获取索引 1:李四 // 4. 修改元素 list.set(2, "王六"); // 索引 2 替换为王六,返回原元素 "王五" // 5. 删除元素 list.remove("张三"); // 按元素删除,返回 true list.remove(0); // 按索引删除,返回被删元素 // 6. 获取元素个数 int size = list.size();

与数组的代码对比:

// 数组方式 User[] arr = new User[3]; arr[0] = user1; arr[1] = user2; arr[2] = user3; // arr[3] = user4; // 编译通过但运行时抛异常,数组长度固定 // ArrayList 方式 ArrayList<User> list = new ArrayList<>(Arrays.asList(user1, user2, user3)); list.add(user4); // 直接追加,自动扩容

五、注意事项

  1. 索引越界:访问 / 删除 / 修改时,索引需在0 ~ size()-1范围内,否则抛出IndexOutOfBoundsException
  2. 泛型约束:创建时指定泛型(如ArrayList<String>),编译器强制类型检查,避免运行时ClassCastException
  3. 基本类型装箱intIntegerdoubleDouble,由 JVM 自动装箱 / 拆箱,无需手动转换。
  4. 线程不安全ArrayList非线程安全,多线程环境需使用Collections.synchronizedList()CopyOnWriteArrayList
http://www.cnnetsun.cn/news/2686501.html

相关文章:

  • 鲁班猫4 5寸触摸屏映射修复
  • 800万条浏览器日志,如何加工成用户画像分析数据?看我教你用助睿ETL做浏览器行为分析
  • 用Python和OpenCV手把手教你从卫星图生成NDVI植被指数图(附完整代码)
  • 量子退火救星:subQUBO算法如何让经典计算机和量子机器协同工作?
  • 面试官:既然你用了原子类,那你知道CAS的工作原理是啥吗?
  • 从零到通话:Freepbx+SIP话机实战配置全记录(6001/6002分机互拨保姆级教程)
  • C语言多线程编程入门:用C11的<threads.h>和原子操作告别pthread的繁琐
  • 神经机器翻译核心原理与工程实践:从Transformer到领域自适应
  • 别再只用应变片了!手把手教你用DIC三维全场应变测量系统做材料力学测试(附精度对比数据)
  • 基于粒子群(PSO)优化LQR+前馈(FF)、LQR+前馈、LQR的车辆路径跟踪控制Matlab仿真
  • 赞噢校园集市数据采集工具包:Scrapy驱动的二手商品全链路信息抓取与热度情感分析
  • 别再瞎调了!Unity 2021.3 Quality设置保姆级指南:从手游优化到PC高画质
  • 用ESP32和2.13寸墨水屏DIY一个能传书的阅读器(开源项目复现指南)
  • 3分钟解锁百度网盘资源:智能提取码工具完全指南
  • 差分放大电路设计避坑指南:从“虚短虚断”到PCB布局,我的Multisim仿真与实战心得
  • 别再死记硬背UML了!用StarUML手把手教你画对象图(附航空购票系统实例)
  • C#跨平台上位机实战:.NET Core下Modbus协议全场景适配方案,从RTU到TCP一网打尽
  • 从光模块到FPGA:手把手教你用Xilinx GTP/GTX收发器搭建高速通信链路
  • 别再只会点灯了!用ESP-01s做个桌面天气时钟,手把手教你从联网到显示(附完整代码)
  • 别再只画云图了!Fluent Report Definitions 实战:一键获取流场关键区域的体积与面积数据
  • 图思维与图数据库:破解AI规模化困境,构建智能决策系统
  • 产品经理也能懂的模型评估:用RMSE、MAE、MAPE跟算法团队高效沟通
  • 保姆级教程:在Ubuntu 22.04上用V4L2从摄像头抓取一张JPEG图片(附完整代码)
  • 神经网络似然估计加速引力波数据分析
  • 手把手教你用示波器抓取Type-C充电‘握手’信号(附波形分析)
  • BI与AI融合:从数据报表到智能决策的实践路径
  • 告别报错!Win10下Autodock Vina 1.2.3完整安装与避坑指南(附批量脚本)
  • Cortex-M3调试状态检测原理与实现方法
  • 从零到一:用Godot 4.2制作你的第一个2D横版动作游戏(完整项目流程与避坑指南)
  • 别再死记硬背达西定律了!用Python模拟地下水流动,直观理解渗流速度与达西速度的区别