【arraylist】在Java编程语言中,`ArrayList` 是一个非常常用的数据结构,它属于 `java.util` 包中的集合框架。`ArrayList` 实现了 `List` 接口,提供了动态数组的功能,能够根据需要自动扩展或缩小容量。相比传统的数组,`ArrayList` 更加灵活,适合在程序运行过程中频繁添加或删除元素的场景。
一、总结
特性 | 描述 |
类型 | 动态数组(基于数组实现) |
实现接口 | `List`、`RandomAccess`、`Cloneable`、`Serializable` |
允许重复元素 | ✅ 是 |
允许空值 | ✅ 是 |
线程安全 | ❌ 否(需手动同步) |
插入/删除性能 | O(n)(因可能需要移动元素) |
查询性能 | O(1)(通过索引访问) |
初始容量 | 默认10 |
自动扩容机制 | 是(默认每次扩容为原容量的1.5倍) |
二、核心特点
- 动态扩容:当 `ArrayList` 中的元素数量超过当前容量时,会自动扩容,通常是原有容量的1.5倍。
- 随机访问:由于底层是数组结构,可以通过索引快速访问元素。
- 非线程安全:在多线程环境下使用时,需要开发者自行处理同步问题。
- 支持泛型:可以定义类型安全的集合,避免类型转换错误。
三、常见用法示例
```java
import java.util.ArrayList;
public class Example {
public static void main(String[] args) {
ArrayList
list.add("Apple");
list.add("Banana");
list.add("Cherry");
System.out.println("元素个数: " + list.size());
System.out.println("是否为空: " + list.isEmpty());
for (String fruit : list) {
System.out.println(fruit);
}
}
}
```
四、适用场景
- 需要频繁插入和删除元素的场景。
- 对元素进行随机访问的场景。
- 不需要线程安全的单线程应用。
五、与 `LinkedList` 的对比
特性 | `ArrayList` | `LinkedList` |
数据结构 | 数组 | 双向链表 |
插入/删除性能 | O(n) | O(1)(已知节点位置时) |
随机访问性能 | O(1) | O(n) |
内存占用 | 较低 | 较高(每个节点有额外指针) |
适用场景 | 频繁查询、少量修改 | 频繁插入/删除、较少查询 |
综上所述,`ArrayList` 是 Java 中非常实用的集合类,适用于大多数需要动态存储数据的场景。选择 `ArrayList` 还是 `LinkedList`,应根据具体需求权衡性能和内存使用情况。