文章目录

ArrayList
和 LinkedList
都是 Java 中常用的动态数组实现,都实现了 List
接口,但它们在内部数据结构和性能方面有所不同:
- 内部数据结构:
ArrayList
是基于动态数组的数据结构,它允许快速随机访问。数组的大小在创建时是固定的,当数组满时,ArrayList
会自动扩容,创建一个新的更大的数组,并将原数组的内容复制到新数组中。LinkedList
是基于双向链表的数据结构,每个元素都是一个节点,包含数据和两个指针,分别指向前一个节点和后一个节点。链表的特点是元素可以灵活地插入和删除,不需要移动其他元素。
- 性能:
ArrayList
提供了更快的随机访问和顺序访问速度,时间复杂度为 O(1)。但是,在数组中间插入或删除元素时,需要移动目标位置后的所有元素,时间复杂度为 O(n)。LinkedList
在链表中间插入和删除元素非常快,时间复杂度为 O(1)。但是,随机访问较慢,时间复杂度为 O(n),因为需要从头节点或尾节点开始遍历链表。
- 内存占用:
ArrayList
由于是基于数组的,需要连续的内存空间,而且在扩容时可能会浪费一些内存(因为新数组可能会留有未使用的空间)。LinkedList
每个元素都需要额外的内存来存储指向前一个和后一个节点的指针,因此在存储大量元素时,可能会比ArrayList
使用更多的内存。
- 适用场景:
- 当需要频繁进行随机访问操作时,
ArrayList
是更好的选择。 - 当需要频繁在列表中间进行插入和删除操作时,
LinkedList
更适合。
选择ArrayList
还是LinkedList
取决于具体的应用场景和对性能的需求。在实际开发中,ArrayList
由于其优异的随机访问性能,通常是最常用的列表实现。只有在特定的场景下,当链表的特性(如频繁的插入和删除操作)能带来明显的性能优势时,才会考虑使用LinkedList
。
- 当需要频繁进行随机访问操作时,
List和set
Java 提供了丰富的集合框架(Collection Framework),用于存储和管理对象集合。这些集合可以分为几个主要类别:
- List(列表):列表是一个有序的集合,可以包含重复的元素。实现 List 接口的类包括:
ArrayList
:基于动态数组的数据结构,提供快速的随机访问和顺序访问。LinkedList
:基于双向链表的数据结构,提供快速的插入和删除操作。Vector
:和ArrayList
类似,但是是同步的,适用于多线程环境。不过,由于同步带来的性能开销,通常建议使用ArrayList
并自行同步,或者使用并发集合。
- Set(集):集是一个无序的集合,不包含重复的元素。实现 Set 接口的类包括:
HashSet
:基于哈希表实现,提供快速的插入、删除和查找操作。LinkedHashSet
:具有HashSet
的查找效率,并且维护了插入顺序。TreeSet
:基于红黑树实现,可以确保元素处于排序状态。EnumSet
:用于存放枚举类型,内部使用位向量实现,非常高效。