概述

本文将探讨Java集合框架中的ArrayList类。我们将讨论它的属性、常见用例以及其优缺点。

ArrayList位于Java核心库中,无需额外导入库。只需添加以下导入语句即可使用:

import java.util.ArrayList;

List接口表示有序值的序列,其中某些值可能出现多次。

ArrayList是基于数组的List实现之一,它可以动态增长或收缩,以适应元素的添加和删除。通过索引(从0开始)可以轻松访问元素。这个实现具有以下特性:

  • 随机访问时间复杂度为O(1)
  • 添加元素的平均时间复杂度为**O(1)**(非递增)
  • 插入/删除操作的时间复杂度为O(n)
  • 在未排序的数组中搜索的时间复杂度为O(n),在排序的数组中为O(log n)

创建ArrayList

ArrayList有多个构造函数,接下来我们会详细介绍。

首先,注意ArrayList是一个泛型类,你可以根据需要对其进行参数化,编译器会确保你不会将Integer值放入String集合中。从集合中获取元素时,也不需要进行类型转换。

其次,最好使用泛型接口List作为变量类型,因为它与特定实现解耦。

2.1. 默认无参构造函数

ArrayList<String> list = new ArrayList<>();

我们简单地创建了一个空的ArrayList实例。

2.2. 指定初始容量的构造函数

ArrayList<String> list = new ArrayList<>(10);

这里你指定底层数组的初始长度,这可以帮助你在添加新项时避免不必要的扩容。

2.3. 使用Collection构造函数

ArrayList<String> list = new ArrayList<>(Arrays.asList("Element1", "Element2"));

请注意,Collection实例的元素被用于填充底层数组。

ArrayList添加元素

你可以将元素添加到末尾或特定位置:

list.add("New Element");
list.add(2, "Another Element");

还可以一次性插入一个集合或多个元素:

list.addAll(Arrays.asList("Yet Another Element", "Third Element"));

遍历ArrayList

有两种类型的迭代器:IteratorListIterator

前者让你按单向顺序遍历列表,后者允许你双向遍历。

这里只展示ListIterator

ListIterator<String> iterator = list.listIterator();

你也可以使用迭代器搜索、添加或删除元素。

搜索ArrayList

我们将演示如何使用集合进行搜索:

if (list.contains("Search Element")) {
    System.out.println("Found!");
}

5.1. 搜索未排序的列表

要查找元素,可以使用indexOf()lastIndexOf()方法,它们接受一个对象并返回整数值:

int index = list.indexOf("Search Element");

如果你想找到满足条件的所有元素,可以使用Java 8的流API(了解更多内容在这里),使用Predicate如下:

list.stream()
    .filter(element -> element.equals("Search Element"))
    .forEach(System.out::println);

也可以使用for循环或迭代器:

for (String element : list) {
    if (element.equals("Search Element")) {
        System.out.println("Found!");
    }
}

5.2. 搜索排序的列表

如果你有一个排序的数组,可以使用更快的二分搜索算法:

int index = Collections.binarySearch(list, "Search Element");

如果找不到元素,将返回-1。

ArrayList移除元素

要移除元素,应先找到其索引,然后通过remove()方法执行删除操作。这个方法的重载版本接受一个对象,它会搜索并移除第一个相等的元素:

list.remove("Element to Remove");

但是,处理像Integer这样的包装类型时要小心。为了移除特定元素,首先需要将int值装箱,否则将根据索引移除元素。

你也可以使用上述流API来移除多个项目,但这里不展示。我们将使用迭代器:

Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    String element = iterator.next();
    if (element.equals("Element to Remove")) {
        iterator.remove();
    }
}

总结

在这篇简短的文章中,我们了解了Java中的ArrayList

我们展示了如何创建ArrayList实例,以及如何使用不同方法添加、查找或移除元素。

如往常一样,所有示例代码可以在GitHub上找到。