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() 等方法及遍历方式,结合扩容机制和线程安全特性,可更高效地使用。

相关推荐
我爱挣钱我也要早睡!4 小时前
Java 复习笔记
java·开发语言·笔记
AD钙奶-lalala6 小时前
Mac OS上搭建 http server
java
磊灬泽6 小时前
【日常错误】鼠标无反应
linux·windows
luckys.one7 小时前
第9篇:Freqtrade量化交易之config.json 基础入门与初始化
javascript·数据库·python·mysql·算法·json·区块链
大翻哥哥8 小时前
Python 2025:量化金融与智能交易的新纪元
开发语言·python·金融
zhousenshan9 小时前
Python爬虫常用框架
开发语言·爬虫·python
IMER SIMPLE10 小时前
人工智能-python-深度学习-经典神经网络AlexNet
人工智能·python·深度学习
CodeCraft Studio10 小时前
国产化Word处理组件Spire.DOC教程:使用 Python 将 Markdown 转换为 HTML 的详细教程
python·html·word·markdown·国产化·spire.doc·文档格式转换
皮皮林55110 小时前
SpringBoot 全局/局部双模式 Gzip 压缩实战:14MB GeoJSON 秒变 3MB
java·spring boot
weixin_4569042710 小时前
Spring Boot 用户管理系统
java·spring boot·后端