arraylist 比普通数组更灵活,因其支持自动扩容、动态增删、泛型安全、便捷互转及隐藏数据搬移细节;但线程不安全,需同步保障。

ArrayList 在 Java 中比普通数组更灵活,核心在于它能自动扩容、支持动态增删元素,而普通数组一旦创建大小就固定。
自动扩容机制让容量不再受限
ArrayList 内部用 Object 数组存储数据,但封装了扩容逻辑。当添加元素超出当前容量时(比如默认初始容量为 10),它会新建一个更大的数组(通常是原容量的 1.5 倍),把旧数据复制过去。你无需手动管理内存或担心越界。
- 通过 add(E e) 添加元素时,扩容自动触发
- 可用 ensureCapacity(int minCapacity) 预留空间,减少频繁扩容开销
- 调用 trimToSize() 可释放多余容量,节省内存
增删操作更自然,无需手动搬移数据
普通数组插入或删除中间元素,需手动循环移动后续所有元素;ArrayList 把这些细节隐藏在 add(int index, E element) 和 remove(int index) 方法里。
- 在指定位置插入:自动后移后续元素,保持顺序
- 删除指定索引元素:自动前移后续元素,集合长度实时更新
- 删除对象值(remove(Object o)):按 equals 判断匹配,适合业务场景
泛型支持让类型安全更直观
ArrayList 是泛型类,声明时指定元素类型(如 ArrayList
- 不能直接创建泛型数组(如 new ArrayList
[10]),但 ArrayList 本身规避了这个问题 - 配合 for-each 循环、Stream API 使用更流畅,例如 list.stream().filter(...).collect(...)
与数组互转方便,兼顾灵活性和性能需求
实际开发中常需和数组协作。ArrayList 提供了便捷转换方法,保留灵活性的同时也能对接底层 API 或性能敏感场景。
- 转数组:list.toArray(new String[list.size()])(推荐带类型参数的重载)
- 数组转 ArrayList:new ArrayList(Arrays.asList(arr))(注意基本类型数组不适用)
- 若需不可变视图,可用 Collections.unmodifiableList(list)
不复杂但容易忽略:ArrayList 的线程不安全,多线程写入需额外同步;若追求并发安全,可考虑 CopyOnWriteArrayList 或外部加锁。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











