一、集合与数组对比ArrayList 是基于数组实现的动态集合类底层为Object[]通过自动扩容机制解决数组长度固定的局限。对比维度数组ArrayArrayList长度固定定义后不可变可变自动扩容存储类型基本数据类型 引用数据类型仅引用数据类型基本类型需包装类自动装箱内置方法仅length属性add()/remove()/get()/set()/size()等泛型支持不支持支持如ArrayListString语法int[] arr new int[5];ArrayListInteger list new ArrayList();使用场景选择场景数组ArrayList元素数量固定、追求极致性能适用不适用元素数量不确定、频繁增删不适用适用存储基本数据类型适用需装箱快速遍历与查找可推荐方法更丰富二、ArrayList 核心成员方法方法签名说明返回值boolean add(E e)向集合末尾添加元素固定返回trueboolean remove(E e)删除第一个匹配的指定元素成功true失败falseE remove(int index)删除指定索引处的元素返回被删除的元素E set(int index, E e)修改指定索引处的元素返回被替换的原元素E get(int index)获取指定索引处的元素返回对应元素int size()获取集合中有效元素个数非底层容量元素数量三、底层实现原理初始容量创建ArrayList时默认构造一个长度为 10 的Object[]数组。自动扩容当元素数量达到容量上限时自动创建更大的数组默认扩容至原容量的 1.5 倍将原数组元素复制到新数组。封装机制add()/get()/remove()等方法底层均操作该Object[]数组对使用者透明。四、基础使用示例// 1. 创建 ArrayList指定泛型 ArrayListString 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 方式 ArrayListUser list new ArrayList(Arrays.asList(user1, user2, user3)); list.add(user4); // 直接追加自动扩容五、注意事项索引越界访问 / 删除 / 修改时索引需在0 ~ size()-1范围内否则抛出IndexOutOfBoundsException。泛型约束创建时指定泛型如ArrayListString编译器强制类型检查避免运行时ClassCastException。基本类型装箱int→Integer、double→Double由 JVM 自动装箱 / 拆箱无需手动转换。线程不安全ArrayList非线程安全多线程环境需使用Collections.synchronizedList()或CopyOnWriteArrayList。
10. JavaArrayList 核心笔记
发布时间:2026/6/1 8:58:11
一、集合与数组对比ArrayList 是基于数组实现的动态集合类底层为Object[]通过自动扩容机制解决数组长度固定的局限。对比维度数组ArrayArrayList长度固定定义后不可变可变自动扩容存储类型基本数据类型 引用数据类型仅引用数据类型基本类型需包装类自动装箱内置方法仅length属性add()/remove()/get()/set()/size()等泛型支持不支持支持如ArrayListString语法int[] arr new int[5];ArrayListInteger list new ArrayList();使用场景选择场景数组ArrayList元素数量固定、追求极致性能适用不适用元素数量不确定、频繁增删不适用适用存储基本数据类型适用需装箱快速遍历与查找可推荐方法更丰富二、ArrayList 核心成员方法方法签名说明返回值boolean add(E e)向集合末尾添加元素固定返回trueboolean remove(E e)删除第一个匹配的指定元素成功true失败falseE remove(int index)删除指定索引处的元素返回被删除的元素E set(int index, E e)修改指定索引处的元素返回被替换的原元素E get(int index)获取指定索引处的元素返回对应元素int size()获取集合中有效元素个数非底层容量元素数量三、底层实现原理初始容量创建ArrayList时默认构造一个长度为 10 的Object[]数组。自动扩容当元素数量达到容量上限时自动创建更大的数组默认扩容至原容量的 1.5 倍将原数组元素复制到新数组。封装机制add()/get()/remove()等方法底层均操作该Object[]数组对使用者透明。四、基础使用示例// 1. 创建 ArrayList指定泛型 ArrayListString 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 方式 ArrayListUser list new ArrayList(Arrays.asList(user1, user2, user3)); list.add(user4); // 直接追加自动扩容五、注意事项索引越界访问 / 删除 / 修改时索引需在0 ~ size()-1范围内否则抛出IndexOutOfBoundsException。泛型约束创建时指定泛型如ArrayListString编译器强制类型检查避免运行时ClassCastException。基本类型装箱int→Integer、double→Double由 JVM 自动装箱 / 拆箱无需手动转换。线程不安全ArrayList非线程安全多线程环境需使用Collections.synchronizedList()或CopyOnWriteArrayList。