当前位置: 首页 > 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.jsqmd.com/news/928225/

相关文章:

  • 扔掉塑料尺:给未来孤勇者的科学排毒指南
  • [分享]EssentialPIM安卓版(手机个人信息管理软件)
  • 告别静音!Windows 11系统声音保姆级配置指南(附完整音效清单与事件对照表)
  • 智慧火灾巡检-基于深度学习火灾烟雾识别系统,森林火灾识别系统。森林火灾检测 无人机森林火灾检测
  • 【周报】液冷板块集体跌停,但我在算一笔账
  • 【AI问答】GO代码循环返值
  • GHelper完整指南:华硕笔记本轻量控制神器的终极教程
  • 技术如何重塑人类感知与希望:算法、AR/VR与数据可视化的中介作用
  • 保姆级教程:用Python和PyTorch从零搭建一个行人重识别(ReID)原型系统
  • 基于YOLOv8的美国手语手势检测系统 美国手语手势检测数据集训练及应用
  • VSCode配置QT环境
  • 华为eNSP静态路由实验教学
  • 第六章:觉醒
  • 航拍地面目标数据集1713张VOC+YOLO格式
  • Ubuntu 远程登录配置
  • 礼盒定制避坑指南!新手品牌常见问题总结
  • 工厂设备预测性维护的必要性与实践案例
  • 别再死记硬背了!用Spring Boot实战案例,5分钟搞懂UML类图的6种关系
  • UE图层混合地形材质
  • 告别无效刷屏!TrendRadar:最快30秒部署的开源热点助手,让你只看真正关心的新闻
  • 如何利用Seraphine智能助手提升英雄联盟游戏体验:5个实战场景终极指南
  • AI Agent 浏览器任务遇到安全验证时,如何设计暂停与人工复核流程
  • 数据结构从零开始③:栈和队列——操作受限的线性表,一篇搞懂
  • mongodb数据库服务器内存过高分析处理
  • ShardingSphere启动慢?别急着升级,先试试调大这个隐藏参数(附源码解析)
  • 别再只画激活图了!用BrainNet Viewer和FSL玩转fMRI脑网络可视化
  • MATLAB App Designer打包后,安装包里到底有啥?带你深度解析三个文件夹的用途
  • 当AI能够创造AI时,人类该如何与其共舞?
  • 企业资产管理软件选型全攻略:选对不选贵,落地是核心
  • Win10用户目录迁移翻车实录:我踩过的三个坑和最终解决方案