数组(Array)
数组是一种基于索引(index)的数据结构,允许我们通过索引快速访问元素。获取数组中数据的时间复杂度为 O(1),这使得数组在读取数据时非常高效。然而,删除数据的开销较大,因为这需要重排数组中的所有元素,以填补被删除元素留下的空缺。这意味着删除操作的时间复杂度为 O(n)。另外,数组的一个缺点是初始化时必须指定其长度,否则会抛出错误。例如:
登录后复制
int[] a = new int[4]; // 指定长度为4
int[] c = {23, 43, 56, 78}; // 初始化数组并定义长度列表(List)
List 是一个有序集合,能够包含重复的元素,并提供按索引访问的方式。它继承自 Collection 接口,有两个主要的实现类:ArrayList 和 LinkedList。
ArrayList
ArrayList 可以被看作是一个自动增长容量的数组。它的底层实现依赖于数组,因此具备快速随机访问的特性。ArrayList 的 toArray 方法可以将列表转换为数组,而 asList 方法则可以将数组转换为列表。在内存中,ArrayList 维护一个字符数组 value
登录后复制
private final char value[]; // 用于字符存储的数组当 ArrayList
LinkedList
LinkedList 是一种双向链表结构,在添加和删除元素时,相比 ArrayList 拥有更好的性能。由于节点间通过引用相连,插入和删除操作的时间复杂度为 O(1),无论是在链表的头部、尾部还是中间。而在访问元素方面,LinkedList 的性能较差,get 和 set 方法的时间复杂度为 O(n)。这使得在频繁进行添加和删除操作时,LinkedList
性能对比
- 随机访问:
ArrayList
- 提供了快速的随机访问能力,因此在需要频繁访问元素时,性能优于
LinkedList
- 。
- 插入和删除:
LinkedList
- 在插入和删除操作上表现更佳,特别是在列表的开头或中间。而
ArrayList
- 内存消耗:
ArrayList
- 通常会占用更少的内存,因为它只存储元素本身。而
LinkedList
使用场景
- 如果你的应用需要频繁访问列表中的元素,尤其是随机访问,那么
ArrayList
- 如果你需要频繁插入或删除元素,特别是在列表的开头或中间,
LinkedList
- 在处理大量数据时,如果你预知列表的大小,可以考虑使用
ArrayList
- ,通过适当设置初始容量来减少动态数组扩展带来的性能开销。
在选择使用 ArrayList 还是 LinkedList 时,需根据具体需求来决定。如果你的操作主要集中在访问元素,选择 ArrayList;如果频繁进行插入和删除,选择 LinkedList。理解这两者的特点将有助于你在 Java 开发中编写出更加高效和灵活的代码。
















