ArrayList详解
1.什么是ArrayList
ArrayList 是 Java 中的一种动态数组实现,它是 Java 集合框架的一部分
与传统的数组不同,ArrayList 可以根据需要动态调整其大小
ArrayList 继承自 AbstractList 类,并实现了 List 接口
2.ArrayList有哪些特点
- 动态数组大小
传统数组的大小是固定的,而 ArrayList 可以根据元素的增加或减少动态调整其大小 - 有序
ArrayList 保持元素的插入顺序,即元素按照插入的顺序排列 - 随机访问
ArrayList 允许快速的随机访问元素,因为 ArrayList 是基于数组实现的,所以可以通过索引直接访问元素,时间复杂度为 O(1) - 允许重复
ArrayList 允许存储重复的元素 - 允许 null 值
ArrayList 允许存储 null 值
3.ArrayList的基本使用方法
演示代码
import java.util.ArrayList;
public class ArrayListDemo {
public static void main(String[] args) {
// 创建一个ArrayList
ArrayList<String> list = new ArrayList<>();
// 添加元素
list.add("Apple");
list.add("Banana");
list.add("Cherry");
// 打印ArrayList
System.out.println("ArrayList: " + list);
// 访问元素
System.out.println("list下标为1的值是: " + list.get(1));
// 修改元素
list.set(1, "Blueberry");
System.out.println("修改后的list: " + list);
// 删除下标为2的元素
list.remove(2);
System.out.println("删除后的list: " + list);
// ArrayList 的大小
System.out.println("ArrayList 的大小: " + list.size());
}
}
输出结果
ArrayList: [Apple, Banana, Cherry]
list下标为1的值是: Banana
修改后的list: [Apple, Blueberry, Cherry]
删除后的list: [Apple, Blueberry]
ArrayList 的大小: 2
4.ArrayList常用方法
方法 | 描述 | 示例代码 |
---|---|---|
add(E e) | 在列表的末尾添加指定的元素 | list.add("Apple"); |
add(int index, E e) | 在列表的指定位置插入指定的元素 | list.add(1, "Banana"); |
get(int index) | 返回列表中指定位置的元素 | String fruit = list.get(1); |
set(int index, E e) | 用指定的元素替换列表中指定位置的元素 | list.set(1, "Cherry"); |
remove(int index) | 移除列表中指定位置的元素 | list.remove(1); |
remove(Object o) | 移除列表中首次出现的指定元素(如果存在) | list.remove("Apple"); |
clear() | 移除列表中的所有元素 | list.clear(); |
size() | 返回列表中的元素数量 | int size = list.size(); |
isEmpty() | 如果列表不包含元素,则返回 true | boolean empty = list.isEmpty(); |
contains(Object o) | 如果列表包含指定的元素,则返回 true | boolean contains = list.contains("Apple"); |
indexOf(Object o) | 返回列表中第一次出现的指定元素的索引 | int index = list.indexOf("Apple"); |
lastIndexOf(Object o) | 返回列表中最后一次出现的指定元素的索引 | int lastIndex = list.lastIndexOf("Apple"); |
toArray() | 返回包含列表中所有元素的数组 | Object[] array = list.toArray(); |
iterator() | 返回列表中元素的迭代器 | Iterator<String> it = list.iterator(); |
5.ArrayList指定创建方法
ArrayList 的默认长度为 10
/**
* 默认初始长度
* Default initial capacity.
*/
private static final int DEFAULT_CAPACITY = 10;
可以指定长度创建 ArrayList
/**
* 构造具有指定初始容量的空列表
* @param 指定列表的初始容量
* @throws 如果指定的初始容量为负,则抛出 IllegalArgumentException 异常
*/
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
如果指定长度等于 0,则使用一个共享的空数组 EMPTY_ELEMENTDATA
这是一个优化,避免为零容量的列表分配新的内存
/**
* 用于空实例的共享空数组实例
*/
private static final Object[] EMPTY_ELEMENTDATA = {};
6.扩容机制
当数据达到 ArrayList 容量(capacity),会触发 ArrayList 自动扩容
- 首先创建一个新的数组,这个数组的长度是原来数组的 1.5 倍
- 使用 ArrayList.copyOf() 方法,把原来数组的数据拷贝到新的数组
当扩容完成以后,会当前要存储的数据,存到新的数组里面
7.注意事项
- 由于扩容机制涉及到数组的复制操作,所以在频繁增加大量元素时,性能可能会受到影响
- ArrayList 是线程不安全的
8.总结
ArrayList 是一种灵活且常用的数据结构,适用于需要动态调整大小并频繁进行随机访问操作的场景