List、ArrayList和LinkedList
1.三者有什么关系?
- 三者是java.util包中的接口和实现类,是集合框架的一部分。
- 实现类ArrayList和LinkedList都实现了List接口。
- 既然实现了List接口,那么ArrayList和LinkedList一定会重写抽象方法,而二者又具备各自的方法。从对象的引用方面来说,用二者的引用可以具备更多的功能;而使用父类引用,这种向上转型的方式,可以更方便地管理子类对象。
2.ArrayList和LinkedList有什么区别?
区别 | ArrayList | LinkedList |
---|---|---|
底层结构 | 动态数组 | 双向链表 |
存储空间 | 一定连续(理论和物理) | 理论是连续,物理不一定连续 |
访问操作 | 随机访问(O(1)) | 遍历(O(n)) |
插入操作 | 要不要扩容?要不要移动后续元素?底层的动态数组扩容是1.5倍扩容;插入操作的时间复杂度为O(n) | 不用考虑扩容;插入操作的时间复杂度为O(n) |
删除操作 | 时间复杂度为O(n) | 时间复杂度为O(n) |
小结:
虽然二者在任意位置的插入和删除都为O(n),但是数组元素的移动的效率更低,且容量是阶段性固定的,这可能导致空间浪费问题。所以ArrayList更多应用于元素高效存储和频繁的访问场景;LinkedList更适用于频繁地插入和删除的场景。