Java 中的集合主要分为三类:Set(集),List(列表),Map(映射)。Set 集合是比较简单的一种集合。主要实现类有 HashSet 和 TreeSet。Set 集合中的对象的时无序的,并且不会重复的。List 集合是以线性存储元素的,主要的实现类有 ArrayList 和 LinkedList。List 集合的元素,是有序的并且可重复的。
HashSet
- HashSet 的底层实现是 HashMap 的 keySet()。
- HashSet 是按照 Hash 算法来存储和读取元素的,存取速度较快。访问成本是O(1)。
- HashSet 的元素可以为 null。
TreeSet
- TreeSet 的底层实现是 TreeMap。
- TreeSet 的元素不允许为 null。
ArrayList
- ArrayList 的底层实现是一个动态数组。我们知道,数组一旦初始化之后,长度就不可变化。这里的动态数组,是指重新生成一个数组,并把之前的数组内容 copy 过去。
- ArrayList 中插入和删除元素的速度较慢,因为涉及到数组的元素移动。
- ArrayList 的元素也可以是 null。
LinkedList
- LinkedList 的底层实现是基于双向链表的。
- LinkedList 的插入和删除速度由于 ArrayList, 读取速度比 ArrayList 差。
- LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列。
- get方法,利用二分法来查找元素。
区别
| 名称 | 底层实现 | 增删 | 查 | 线程安全 | 有序 | 元素可重复 | 元素可为空 |
|---|---|---|---|---|---|---|---|
| HashSet | HashMap | 较快 | 较快 | 否 | 否 | 否 | 是 |
| TreeSet | TreeMap | 较慢 | 较慢 | 否 | 是 | 否 | 否 |
| ArrayList | 动态数组 | 较慢 | 较快 | 否 | 是 | 是 | 是 |
| LinkedList | 双向链表 | 较快 | 较慢 | 否 | 是 | 是 | 是 |
时间复杂度
| 对象 | add方法 | get方法 | contains方法 |
|---|---|---|---|
| HashSet | O(1) | O(1) | O(1) |
| TreeSet | O(logn) | - | O(logn) |
| ArrayList | O(1) | O(1) | O(n) |
| LinkedList | O(1) | O(1) | O(n) |
总结
- 集合元素可重复,使用 List。反之使用 Set。
- 查询操作较多,建议使用 ArrayList。
- 增删元素较多,建议使用 LinkedList。