Java ArrayList的介绍及用法

十分想念顺店杂可。。。

ArrayList 是 Java 集合框架中最常用的类之一,实现了 List 接口,底层基于动态数组实现,支持动态扩容,相比普通数组更灵活。以下是其详细介绍及用法:

一、核心特性

  1. 动态大小:无需预先指定容量,可自动扩容(初始容量为 10,满后扩容为原容量的 1.5 倍)。
  2. 允许重复元素:可存储多个相同值的元素。
  3. 有序集合:元素按插入顺序排列,支持通过索引访问。
  4. 非线程安全 :多线程环境下并发修改可能导致异常(需手动同步或使用 CopyOnWriteArrayList)。
  5. 存储引用类型 :只能存储对象(基本类型需用包装类,如 Integer 而非 int)。

二、基本用法(代码示例)

1. 引入包与创建对象

ArrayList 位于 java.util 包,需先导入,创建时需指定泛型(元素类型):

java 复制代码
import java.util.ArrayList;
import java.util.List;

public class ArrayListDemo {
    public static void main(String[] args) {
        // 创建存储String类型的ArrayList(推荐声明为List接口)
        List<String> list = new ArrayList<>();
        
        // 可指定初始容量(减少扩容次数,优化性能)
        List<Integer> numList = new ArrayList<>(20); // 初始容量20
    }
}
2. 常用方法
(1)添加元素:add()
java 复制代码
List<String> list = new ArrayList<>();
list.add("Java"); // 末尾添加元素 → [Java]
list.add(0, "Python"); // 指定索引插入 → [Python, Java](索引需≤当前size)
list.addAll(List.of("C", "C++")); // 批量添加 → [Python, Java, C, C++]
(2)访问元素:get()

通过索引获取元素(索引从 0 开始,需注意 IndexOutOfBoundsException):

java 复制代码
String first = list.get(0); // 获取第1个元素 → "Python"
int size = list.size(); // 获取元素个数 → 4
(3)修改元素:set()

替换指定索引的元素,返回被替换的旧值:

java 复制代码
String old = list.set(1, "JavaScript"); // 替换索引1的元素 → 旧值"Java"
// 此时list为 [Python, JavaScript, C, C++]
(4)删除元素:remove()
java 复制代码
String removed = list.remove(2); // 移除索引2的元素 → 返回"C",list变为 [Python, JavaScript, C++]
boolean isRemoved = list.remove("C++"); // 移除指定值的元素 → 返回true,list变为 [Python, JavaScript]
(5)判断与查找
java 复制代码
boolean isEmpty = list.isEmpty(); // 判断是否为空 → false
boolean contains = list.contains("Python"); // 是否包含指定元素 → true
int index = list.indexOf("JavaScript"); // 首次出现的索引 → 1
int lastIndex = list.lastIndexOf("Python"); // 最后出现的索引 → 0(元素唯一时与indexOf相同)
(6)清空与截取
java 复制代码
list.clear(); // 清空所有元素 → list变为空
List<String> subList = list.subList(0, 2); // 截取子列表(从索引0到2,不含2)→ [Python, JavaScript]
3. 遍历方式
(1)普通 for 循环(通过索引)
java 复制代码
for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));
}
(2)增强 for 循环(foreach)
java 复制代码
for (String element : list) {
    System.out.println(element);
}
(3)迭代器(Iterator

支持在遍历中安全删除元素:

java 复制代码
import java.util.Iterator;

Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    String element = iterator.next();
    if (element.equals("Python")) {
        iterator.remove(); // 安全删除当前元素
    }
}
(4)Java 8+ 流(Stream)
java 复制代码
list.stream().forEach(System.out::println); // 简化遍历

三、注意事项

  1. 扩容机制 :当元素数量超过当前容量时,ArrayList 会自动扩容为原容量的 1.5 倍(通过 Arrays.copyOf() 复制数组)。若预知元素数量,创建时指定初始容量可减少扩容次数(提升性能)。

  2. 与数组的转换

    java 复制代码
    // ArrayList → 数组
    String[] arr = list.toArray(new String[0]); // 推荐传递类型数组,避免强制转换
    
    // 数组 → ArrayList(注意:返回的是固定大小的List,不能添加/删除元素)
    List<String> fixedList = Arrays.asList(arr); 
    // 若需可变List,需再包装一次:
    List<String> mutableList = new ArrayList<>(Arrays.asList(arr));
  3. 与 LinkedList 的对比

    • ArrayList 基于数组,随机访问快get(index) 时间复杂度 O (1)),增删中间元素慢(需移动元素,O (n))。
    • LinkedList 基于链表,增删中间元素快 (O(1)),随机访问慢(O(n))。
    • 频繁查改选 ArrayList,频繁增删中间元素选 LinkedList
  4. 线程安全 :多线程环境下,可使用 Collections.synchronizedList() 包装:

    java 复制代码
    List<String> safeList = Collections.synchronizedList(new ArrayList<>());

四、总结

ArrayList 是日常开发中最常用的 List 实现,以动态数组为核心,兼顾灵活性与访问效率,适合大多数场景。掌握其 add()get()remove() 等方法及遍历方式,结合扩容机制和线程安全特性,可更高效地使用。

相关推荐
桦说编程20 分钟前
Java 中如何创建不可变类型
java·后端·函数式编程
lifallen21 分钟前
Java Stream sort算子实现:SortedOps
java·开发语言
IT毕设实战小研23 分钟前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
wyiyiyi1 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
cpsvps_net1 小时前
美国服务器环境下Windows容器工作负载智能弹性伸缩
windows
mit6.8241 小时前
[1Prompt1Story] 滑动窗口机制 | 图像生成管线 | VAE变分自编码器 | UNet去噪神经网络
人工智能·python
没有bug.的程序员1 小时前
JVM 总览与运行原理:深入Java虚拟机的核心引擎
java·jvm·python·虚拟机
一只爱撸猫的程序猿1 小时前
使用Spring AI配合MCP(Model Context Protocol)构建一个"智能代码审查助手"
spring boot·aigc·ai编程
阿华的代码王国2 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端