java基础-ArrayList

Java ArrayList 是 Java 集合框架(Java Collections Framework)中的一个核心类,属于 java.util 包。它实现了 List 接口,是一个动态数组,可以根据需要自动调整大小(扩容或缩容),提供了比传统数组更灵活的操作方式。

ArrayList 的核心特点

  1. 动态扩容
    • 传统数组(如 int[])长度固定,而 ArrayList 可以动态增长或缩小。
    • 当元素数量超过当前容量时,ArrayList 会自动扩容(通常扩容为原来的 1.5 倍)。
  2. 基于索引的随机访问
    • 支持通过索引(get(index))快速访问元素,时间复杂度为 O(1)。
  3. 允许重复元素
    • 可以存储重复的元素(与 Set 不同)。
  4. 有序性
    • 元素按插入顺序存储,可以通过索引访问或遍历。
  5. 非线程安全
    • ArrayList 不是线程安全的,多线程环境下需要手动同步或使用 CopyOnWriteArrayList 等线程安全类。

ArrayList 的基本用法

1. 创建 ArrayList
java 复制代码
import java.util.ArrayList;

// 创建一个空的 ArrayList(默认初始容量为 10)
ArrayList<String> list = new ArrayList<>();

// 指定初始容量(减少扩容次数,提高性能)
ArrayList<Integer> numbers = new ArrayList<>(20);
2. 常用操作
java 复制代码
// 添加元素
list.add("Apple");      // 添加到末尾
list.add(0, "Banana");  // 在索引 0 处插入

// 访问元素
String fruit = list.get(0); // 获取索引 0 的元素

// 修改元素
list.set(0, "Orange"); // 将索引 0 的元素改为 "Orange"

// 删除元素
list.remove(0);        // 删除索引 0 的元素
list.remove("Apple");   // 删除第一个匹配的 "Apple"

// 获取大小
int size = list.size(); // 返回元素数量

// 检查是否包含元素
boolean containsApple = list.contains("Apple");

// 清空列表
list.clear();
3. 遍历 ArrayList
java 复制代码
// 方式 1:增强 for 循环
for (String item : list) {
    System.out.println(item);
}

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

// 方式 3:Java 8+ forEach + Lambda
list.forEach(item -> System.out.println(item));

ArrayList vs 数组

特性 ArrayList 数组(如 int[])
长度 动态可变 固定长度
内存开销 稍高(存储额外信息) 较低
功能 提供丰富的 API(如 add()、remove()) 仅支持基本操作(索引访问)
性能 插入/删除较慢(需移动元素) 随机访问快(O(1))
适用场景 需要频繁增删元素 已知固定大小且无需修改

ArrayList 的底层实现

  • 内部使用数组 :ArrayList 内部维护了一个 Object[] elementData 数组来存储元素。
  • 扩容机制:当元素数量超过当前数组长度时,会创建一个更大的新数组(通常是原大小的 1.5 倍),并将旧数组内容复制到新数组。

何时使用 ArrayList?

  • 需要频繁增删元素(尤其是末尾)。
  • 需要随机访问元素(通过索引)。
  • 不确定最终数据大小,希望动态调整。

何时避免使用 ArrayList?

  • 多线程环境(需改用 Vector 或 CopyOnWriteArrayList)。
  • 需要频繁在头部或中间 插入/删除元素(考虑 LinkedList)。

示例代码

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

public class Main {
    public static void main(String[] args) {
        ArrayList<String> fruits = new ArrayList<>();
        
        // 添加元素
        fruits.add("Apple");
        fruits.add("Banana");
        fruits.add("Cherry");
        
        // 遍历
        for (String fruit : fruits) {
            System.out.println(fruit);
        }
        
        // 删除元素
        fruits.remove("Banana");
        
        // 检查大小
        System.out.println("Size: " + fruits.size());
    }
}

输出:

java 复制代码
Apple
Banana
Cherry
Size: 2
相关推荐
Hello.Reader1 分钟前
Three.js / Cesium 卡顿怎么办?把三维渲染搬到 GPU 服务器
服务器·开发语言·javascript
Solange__8 分钟前
AI世界模型、3D场景生成和游戏引擎怎么选?按5类任务比较交互、物理与导出
开发语言·人工智能·游戏·平面·3d·自然语言处理·游戏引擎
椒颜皮皮虾྅15 分钟前
模型部署不再卡在环境上:DeploySharp 四大推理引擎与 Windows/Linux 离线交付实战
linux·运维·开发语言·人工智能·windows·计算机视觉·cuda
郭小李21 分钟前
mybatis的 Mapper.xml语法
xml·java·mybatis
小蒜学长24 分钟前
基于SpringBoot 框架的自媒体新闻系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·mysql数据库·自媒体新闻管理系统
96245625 分钟前
补打一条卡,为什么要从前一天重新算:人工补录与实时重算业务复盘
java·mysql·kafka
codebolt28 分钟前
C++程序crash分析和内存检测
开发语言·c++
椒颜皮皮虾྅28 分钟前
让 C# 读懂整张图:DeploySharp 驱动 PaddleOCR v4/v5/v6,打通 OCR 全流程
开发语言·人工智能·深度学习·学习·c#·ocr·cuda
昂好的day32 分钟前
C# 同步异步与多线程:Thread / Task / 线程池一次讲透(上篇)
开发语言·windows·c#
Java后端的Ai之路34 分钟前
01、Java并发编程:学习攻略如何才能学好并发编程?
java·开发语言·学习