ArrayList 动态数组

ArrayList 是 Java 中 java.util 包中的一个类,它实现了 List 接口并提供了基于动态数组的列表实现。与 LinkedList 相比,ArrayList 提供了对元素的快速访问(通过索引),但在元素插入和删除时可能会稍慢,尤其是在中间位置。它是最常用的动态数组实现之一,适用于需要频繁访问和较少插入/删除的场景。

以下是 ArrayList 的详细介绍和常见用法:

1. 方法介绍

import java.util.ArrayList;//导入 ArrayList

//无参构
ArrayList<Integer> list = new ArrayList<>(); // 空的 ArrayList,默认容量为 10
//指定初始容量来创建
ArrayList<String> listWithCapacity = new ArrayList<>(20); // 指定初始容量为 20

//add(E e) 添加元素到列表的末尾。
list.add(10); // 添加一个元素

//add(int index, E element)在指定位置插入元素。
list.add(1, 15); // 在索引 1 处插入元素 15

//get(int index)返回指定索引位置的元素
int element = list.get(0); // 获取索引 0 位置的元素

//set(int index, E element):更新指定索引位置的元素,返回旧值。
list.set(0, 100); // 将索引 0 位置的元素更新为 100

//删除元素
//remove(int index):删除指定索引位置的元素,返回被删除的元素。
int removedElement = list.remove(1); // 删除索引 1 位置的元素
//remove(Object o):删除指定元素的第一个匹配项,如果列表中有多个相同的元素,只会删除第一个匹配项。
list.remove(Integer.valueOf(10)); // 删除元素 10

//查找元素
//contains(Object o):检查 `ArrayList` 是否包含指定的元素。
boolean contains = list.contains(20); // 判断列表中是否包含元素 20
//indexOf(Object o):返回指定元素在 `ArrayList` 中的索引,如果不存在返回 `-1`。
int index = list.indexOf(20); // 查找元素 20 在列表中的索引

//获取列表大小
//size():返回 `ArrayList` 中元素的个数。
int size = list.size(); // 获取列表中的元素个数

//clear():清空 `ArrayList` 中的所有元素。
list.clear(); // 清空列表

//isEmpty():检查 `ArrayList` 是否为空
boolean isEmpty = list.isEmpty(); // 判断列表是否为空

//toArray():将 `ArrayList` 转换为数组。
 Object[] array = list.toArray(); // 转换为 Object 数组
Integer[] integerArray = list.toArray(new Integer[0]); // 转换为 Integer 类型数组

2. 实验示例

下面是一个简单的 ArrayList 使用示例:

import java.util.ArrayList;

public class ArrayListExample {
    public static void main(String[] args) {
        // 创建一个 ArrayList
        ArrayList<Integer> list = new ArrayList<>();
        
        // 向列表中添加元素
        list.add(10);
        list.add(20);
        list.add(30);
        
        // 输出列表的内容
        System.out.println("列表内容: " + list);
        
        // 获取列表中指定位置的元素
        System.out.println("索引 1 的元素: " + list.get(1)); // 输出 20
        
        // 更新列表中的元素
        list.set(1, 25);
        System.out.println("更新后的列表内容: " + list);
        
        // 删除列表中的元素
        list.remove(0); // 删除索引 0 的元素
        System.out.println("删除后的列表内容: " + list);
        
        // 判断列表中是否包含某个元素
        System.out.println("列表是否包含 25: " + list.contains(25)); // 输出 true
        
        // 查找元素在列表中的索引
        System.out.println("25 在列表中的索引: " + list.indexOf(25)); // 输出 0
        
        // 获取列表的大小
        System.out.println("列表的大小: " + list.size()); // 输出 2
        
        // 清空列表
        list.clear();
        System.out.println("清空后的列表内容: " + list);
    }
}

3. 性能特点

  • 添加元素add(E e) 是常数时间操作(O(1)),但如果数组容量不足时,会触发扩容操作,这时会有 O(n) 的性能开销。
  • 访问元素get(int index) 是常数时间操作(O(1)),由于 ArrayList 是基于数组实现的,索引访问非常高效。
  • 删除元素:删除操作(remove())的时间复杂度为 O(n),因为删除元素后需要移动其后的所有元素来填补空缺。
  • 动态扩容ArrayList 在达到容量上限时,会自动扩容,通常是当前容量的 1.5 倍。扩容的代价是 O(n)

4. 常见用法

1) 存储自定义对象

ArrayList 不仅能存储基本类型,还能存储自定义对象。例如:

import java.util.ArrayList;

class Person {
    String name;
    int age;
    
    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + "}";
    }
}

public class PersonArrayList {
    public static void main(String[] args) {
        ArrayList<Person> list = new ArrayList<>();
        list.add(new Person("Alice", 30));
        list.add(new Person("Bob", 25));

        // 输出每个人的信息
        for (Person person : list) {
            System.out.println(person);
        }
    }
}
2) 迭代遍历

ArrayList 支持多种遍历方式,如 for 循环、for-each 循环、Iterator 等:

// 通过 for 循环
for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));
}

// 使用 for-each 循环
for (Integer num : list) {
    System.out.println(num);
}

// 使用 Iterator
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

5. 注意

  • ArrayList 是一个动态数组的实现,提供了快速的索引访问和灵活的大小调整。
  • 它是基于数组实现的,因此适合需要频繁随机访问的场景。
  • 对于插入或删除元素,特别是在中间位置的操作,它的性能较差,因为这些操作可能需要移动大量元素。
  • 使用 ArrayList 时,要注意性能开销,尤其是在频繁插入和删除元素时,可以考虑使用 LinkedList 替代。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YiHanXii

呜呜呜我想喝奶茶

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值