ArrayList 是 Java 中最常用的集合类之一,它位于 java.util 包中,属于 List 接口的实现类。ArrayList 基于数组实现,可以动态调整大小,允许存储重复元素,并支持快速的随机访问操作。
集合和数组的优势对比:
- 长度可变
- 添加数据的时候不需要考虑索引,默认将数据添加到末尾
下面详细介绍 ArrayList 的各个方面。
1. ArrayList 的基本概念
ArrayList 是一个动态数组,其内部通过数组来存储元素。它允许按索引位置访问元素,因此具有高效的随机访问性能。但是,当涉及到插入或删除元素时,尤其是在列表的中间或开始位置时,ArrayList 的性能可能会受到影响,因为需要移动数组中的其他元素。
1.1 ArrayList类概述
-
什么是集合
提供一种存储空间可变的存储模型,存储的数据容量可以发生改变
-
ArrayList集合的特点
长度可以变化,只能存储引用数据类型。
-
泛型的使用
用于约束集合中存储元素的数据类型
2. 创建 ArrayList
你可以通过多种方式创建一个 ArrayList。
2.1 创建一个空的 ArrayList:
ArrayList<String> list = new ArrayList<>();
这会创建一个空的 ArrayList,其初始容量是 10(默认值)。当添加的元素超过当前容量时,ArrayList 会自动扩展容量。
2.2 创建一个具有指定初始容量的 ArrayList:
ArrayList<String> list = new ArrayList<>(20); // 初始容量为 20
这种方式适用于当你已经知道大概会有多少元素需要存储时,可以避免 ArrayList 多次扩展容量带来的性能开销。
2.3 使用现有集合创建 ArrayList:
你还可以通过将一个现有的集合(如 List 或 Set)传递给 ArrayList 构造函数来创建一个新的 ArrayList。
ArrayList<String> list = new ArrayList<>(existingList);
3. 常用方法
方法名 | 说明 |
---|---|
public boolean add(要添加的元素) | 将指定的元素追加到此集合的末尾 |
public boolean remove(要删除的元素) | 删除指定元素,返回值表示是否删除成功 |
public E remove(int index) | 删除指定索引处的元素,返回被删除的元素 |
public E set(int index,E element) | 修改指定索引处的元素,返回被修改的元素 |
public E get(int index) | 返回指定索引处的元素 |
public int size() | 返回集合中的元素的个数 |
3.1 添加元素
你可以通过 add() 方法将元素添加到 ArrayList 中:
list.add("Apple");
list.add("Banana");
list.add("Orange");
- add(E e):将元素添加到列表的末尾。
- add(int index, E element):在指定位置插入元素,其他元素会向后移动。
3.2 访问元素
你可以通过 get() 方法访问指定索引位置的元素:
String fruit = list.get(1); // 获取索引为 1 的元素
- get(int index):返回指定位置的元素。
3.3 修改元素
你可以通过 set() 方法修改指定索引位置的元素:
list.set(1, "Mango"); // 将索引 1 的元素改为 "Mango"
- set(int index, E element):用指定的元素替换指定位置的元素。
3.4 删除元素
删除元素的方法有多种:
通过索引删除:
list.remove(1); // 删除索引为 1 的元素
通过元素删除:
list.remove("Orange"); // 删除元素 "Orange"
- remove(int index):根据索引删除元素。
- remove(Object o):根据元素删除元素。
3.5 获取大小
ArrayList 提供了 size() 方法来获取当前列表中元素的个数:
int size = list.size(); // 获取 ArrayList 的大小
- size():返回列表中元素的数量。
3.6 检查元素是否存在
可以使用 contains() 方法来检查 ArrayList 中是否包含某个元素:
boolean containsApple = list.contains("Apple");
System.out.println(containsApple); // 输出: true
- contains(Object o):检查 ArrayList 是否包含指定的元素。
3.7 清空列表
使用 clear() 方法可以删除 ArrayList 中的所有元素:
list.clear(); // 清空 ArrayList
- clear():移除所有的元素。
3.8 检查是否为空
使用 isEmpty() 方法检查 ArrayList 是否为空:
boolean isEmpty = list.isEmpty();
System.out.println(isEmpty); // 输出: false (如果列表不为空)
- isEmpty():如果 ArrayList 为空,返回 true。
3.9 获取索引
你可以使用 indexOf() 方法来获取元素的索引,如果元素存在,返回其第一个出现的位置,若不存在则返回 -1。
int index = list.indexOf("Banana"); // 获取元素 "Banana" 的索引
- indexOf(Object o):返回指定元素的索引位置。
3.10 子列表
你可以通过 subList() 方法获取一个指定区间的子列表:
List<String> sublist = list.subList(0, 2); // 获取从索引 0 到 2 的子列表
- subList(int fromIndex, int toIndex):返回一个包含指定范围元素的子列表。
4. 遍历 ArrayList
ArrayList 提供了多种方式来遍历其元素,常用的有以下几种:
4.1 使用增强型 for 循环:
for (String fruit : list) {
System.out.println(fruit);
}
4.2 使用传统 for 循环:
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
4.3 使用 Iterator:
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
4.4 使用 Java 8 的 forEach() 方法:
list.forEach(fruit -> System.out.println(fruit));
5. 性能特点
ArrayList 提供了高效的随机访问性能,但在某些操作上可能会遇到性能瓶颈:
5.1 访问操作:O(1)
ArrayList 提供常数时间复杂度(O(1))的随机访问性能。这意味着你可以快速地通过索引访问任何元素。
5.2 插入和删除操作:O(n)
在数组中间或开头插入或删除元素时,由于需要移动其他元素,因此时间复杂度为 O(n)。但在末尾插入或删除元素的时间复杂度为 O(1),因为它不需要移动其他元素。
5.3 扩容:O(n)
ArrayList 会在需要时扩展其内部数组。当数组的容量达到上限时,ArrayList 会创建一个更大的数组,并将原始数组的元素复制到新的数组中。这种扩容操作的时间复杂度是 O(n)。
6. 扩容机制
ArrayList 会在元素数量超出当前容量时自动扩容。默认情况下,当数组的容量达到上限时,ArrayList 会将容量扩大为原来的 1.5 倍。例如,假设初始容量为 10,当容量满时,它会扩展到 15。当扩展时,ArrayList 会创建一个新的更大的数组,并将原数组的所有元素复制到新的数组中。
标签:java,删除,int,ArrayList,元素,list,索引,集合 From: https://blog.csdn.net/qq_48763502/article/details/145101842