Array、ArrayList和LinkedList
Array、ArrayList和LinkedList
底层原理见:Java集合进阶
1. Array和ArrayList的区别
- 类型:
Array是Java中的一种基本数据结构,可以存储基本数据类型或对象引用。ArrayList是Java集合框架中的一个类,实现了List接口,只能存储对象引用。
- 大小可变性:
Array的大小是固定的,在创建时必须指定,不能动态调整。ArrayList的大小是可变的,可以根据需要动态增加或减少元素。
- 性能:
Array在访问元素时性能较好,因为它是连续的内存块,支持快速索引。ArrayList在添加或删除元素时可能更高效,尤其是在数组末尾操作时。
- 泛型支持:
Array可以是泛型的,也可以不是。ArrayList必须是是泛型的,提供了类型安全。
- 方法:
Array提供的操作有限,主要是基本的数据访问和修改。ArrayList提供了丰富的方法,如添加、删除、查找等操作
| 维度 | Array | ArrayList |
|---|---|---|
| 长度/容量 | 固定长度,一旦创建,长度不可变 | 长度可变,可根据需要自动扩容和缩容 |
| 元素类型 | 可存储基本数据类型和引用类型 | 只能存储引用类型,基本类型会自动装箱 |
| API/操作 | 功能单一,通过[]运算符访问,无内置方法 |
提供了丰富的API方法(add(),remove(),get()等) |
| 泛型支持 | 不直接支持泛型,编译时类型检查不如ArrayList严格 | 原生支持泛型,提供编译时类型安全 |
| 底层实现 | 语言内置的底层数据结构 | 基于动态数组实现,是集合框架的一部充分 |

- 面试官可能的追问:在Java中,当需要存储大量基本数据类型时,除了数组,还有其他什么选择吗?
- Apache Commons Lang库: 这个库提供了
ArrayUtils等工具类,以及PrimitiveIterator等,可以更方便地操作基本类型数组。 - Guava库: 提供了
Ints,Longs等工具类,以及ImmutableList的基本类型版本,用于处理基本类型的集合,避免装箱。 - FastUtil或Trove库: 这些是专门为高性能基本类型集合设计的第三方库,它们提供了
IntArrayList,LongHashSet等,直接在内部使用基本类型数组,完全避免了装箱拆箱,性能远超java.util包中的标准集合类,适用于大数据量和对性能要求比较高的场景。
- Apache Commons Lang库: 这个库提供了
2. ArrayList和LinkedList的区别
- 数据结构:
ArrayList是基于动态数组实现的,适合随机访问。LinkedList是基于双向链表实现的,适合插入和删除操作。
- 性能:
ArrayList在随机访问元素时速度较快,因为它支持索引访问。LinkedList在随机访问元素时速度较慢,需要遍历链表,但在插入和删除元素时更高效。
- 内存使用:
ArrayList由于是基于数组,它在存储大量元素时可能会更高效。LinkedList每个元素都需要额外的内存空间来存储前驱和后继元素的引用。
- 扩容:
ArrayList在需要扩容时,会创建一个更大的数组并复制元素,可能会导致性能下降。LinkedList不需要扩容,因为它通过链接节点来增加元素。
- 功能:
ArrayList提供了更快地随机访问和更高效的内存使用。LinkedList提供了更高效的插入和删除操作,并且可以更有效的实现栈和队列等数据结构。
