java学习--ArrayList

一、什么是 ArrayList

ArrayListjava.util 包下的类,实现了 List 接口,本质是动态扩容的数组(相比普通数组,它的长度可以自动调整)。

  • 底层基于数组实现,支持快速随机访问(通过索引取值,时间复杂度 O (1))。
  • 增删元素(尤其是中间位置)效率较低(需要移动元素,时间复杂度 O (n))。
  • 允许存储 null 值,且元素可重复,有序(按添加顺序保存)。

二、核心用法(完整示例代码)

以下是 ArrayList 最常用的操作,代码可直接复制运行:

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

public class ArrayListDemo {
    public static void main(String[] args) {
        // 1. 创建 ArrayList 对象(指定泛型,推荐,避免类型转换问题)
        List<String> list = new ArrayList<>();

        // 2. 添加元素
        list.add("Java");       // 末尾添加
        list.add("Python");
        list.add(1, "C++");     // 指定索引(1)添加,原索引1及之后的元素后移
        System.out.println("添加后:" + list); // 输出:[Java, C++, Python]

        // 3. 获取元素
        String first = list.get(0); // 通过索引获取,索引从0开始
        System.out.println("第一个元素:" + first); // 输出:Java

        // 4. 修改元素
        list.set(2, "Go"); // 替换索引2的元素
        System.out.println("修改后:" + list); // 输出:[Java, C++, Go]

        // 5. 删除元素
        list.remove(1);    // 按索引删除
        list.remove("Go"); // 按元素值删除
        System.out.println("删除后:" + list); // 输出:[Java]

        // 6. 遍历元素(三种常用方式)
        // 方式1:for循环(按索引)
        System.out.println("for循环遍历:");
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }

        // 方式2:增强for循环
        System.out.println("增强for循环遍历:");
        for (String s : list) {
            System.out.println(s);
        }

        // 方式3:迭代器
        System.out.println("迭代器遍历:");
        Iterator<String> it = list.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }

        // 7. 其他常用方法
        int size = list.size(); // 获取元素个数
        boolean isEmpty = list.isEmpty(); // 判断是否为空
        boolean contains = list.contains("Java"); // 判断是否包含某个元素
        list.clear(); // 清空所有元素
    }
}

三、关键特性解析

  1. 扩容机制

    • 初始容量默认是 10(JDK8 及以上),当元素个数超过当前容量时,会自动扩容为原来的 1.5 倍 (计算方式:newCapacity = oldCapacity + (oldCapacity >> 1))。
    • 如果提前知道元素数量,可通过 new ArrayList<>(指定容量) 初始化,减少扩容次数,提升性能。
  2. 线程安全

    • ArrayList非线程安全 的,如果多线程同时读写 ArrayList,可能会导致数据错乱。
    • 线程安全场景可使用:Vector(古老的线程安全版,效率低)、Collections.synchronizedList(new ArrayList<>())CopyOnWriteArrayList(高并发读场景推荐)。
  3. 与普通数组的区别

    特性 ArrayList 普通数组
    长度 动态扩容 固定长度
    方法支持 丰富(add/remove 等) 仅通过索引操作
    存储类型 只能存对象(基本类型自动装箱) 可存基本类型 / 对象

四、常见面试 / 使用注意点

  • 遍历删除元素 :不能在增强 for 循环中直接删除元素(会抛 ConcurrentModificationException),需用迭代器的 it.remove() 方法。示例:

    复制代码
    List<String> list = new ArrayList<>();
    list.add("a");
    list.add("b");
    Iterator<String> it = list.iterator();
    while (it.hasNext()) {
        String s = it.next();
        if (s.equals("a")) {
            it.remove(); // 正确删除方式
        }
    }
  • 空指针风险list.get(index) 时,若索引越界(如 index >= list.size ()),会抛 IndexOutOfBoundsException,使用前需校验索引合法性。

总结

  1. ArrayList 是基于动态数组的 List 实现,支持快速随机访问,增删中间元素效率低,有序、可重复、允许 null。
  2. 核心操作包括添加(add)、获取(get)、修改(set)、删除(remove)、遍历,推荐指定泛型避免类型转换问题。
  3. 非线程安全,扩容默认 1.5 倍,遍历删除需用迭代器,提前指定容量可优化性能。
相关推荐
编程大师哥2 小时前
JavaEE初阶的核心组件
java·java-ee
华如锦2 小时前
MongoDB作为小型 AI智能化系统的数据库
java·前端·人工智能·算法
q***44152 小时前
C++跨平台开发挑战的技术文章大纲编译器与工具链差异
java·后端
stillaliveQEJ3 小时前
【javaEE】Spring AOP(一)
java·spring·java-ee
week_泽3 小时前
第4课:为什么记忆能力如此重要 - 学习笔记_4
人工智能·笔记·学习·ai agent
麦兜*3 小时前
SpringBoot进阶:深入理解SpringBoot自动配置原理与源码解析
java·spring boot·spring·spring cloud
慕白Lee3 小时前
项目JDK17+SpringBoot3.0升级
java·ide·intellij-idea
week_泽4 小时前
第6课:如何管理短期记忆和长期记忆 - 学习笔记_6
人工智能·笔记·学习·ai agent
map_vis_3d5 小时前
JSAPIThree 加载简单点图层学习笔记:SimplePoint 散点可视化
笔记·学习·信息可视化·mapvthree·jsapithree·simplepoint·点图层