概述
本文将探讨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
有两种类型的迭代器:Iterator
和ListIterator
。
前者让你按单向顺序遍历列表,后者允许你双向遍历。
这里只展示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上找到。