Collection & Collections Part 1/2: Collection
目录
Overview
Collection和Collections是刚开始学习Java时容易混淆的两个”类”。
- Collection是一个接口,供各集合类实现。
- Collections是一个类,里面的方法都是static的,它是一个工具类,所有的方法都对Collection进行操作。
之前几篇博文已经详细阅读了ArrayList,LinkedList,HashSet以及HashMap的源码,这篇博文总结下Collection类。
Collection家族的族谱如下:
List
List可以看做更灵活的数组,特点如下:
- 元素有序
- 元素可重复
- 元素可以通过在List中的位置(索引)进行访问和插入
实现类: ArrayList, LinkedList, Vector。
- ArrayList
- 基础数据结构是数组。
- 可以根据存储元素的数量自动地伸缩自身的size。
- 由于数组中元素的插入和删除涉及到大量元素的前移或后移,效率不高,此时最好不要用ArrayList;由于数组中元素可以根据索引直接找到,所以访问的效率很高,此时推荐使用ArrayList。
- 线程不安全,多线程环境不推荐使用。
LinkedList
- 基础数据结构是链表
- LinkedList实现了Stack, Queue(Deque)的功能。
- 由于链表中元素的访问需要从表头开始遍历,时间复杂度为O(N),所以此时最好不要用LinkedList;由于链表中的元素的插入和删除只需改变指针的指向,O(1)即可完成,此时推荐使用LinkedList。
- 线程不安全,多线程环境不推荐使用。
Vector
- 基础数据结构也是数组。
- 与ArrayList一样,不适用元素的插入和删除,适用于元素的访问
- 线程安全,不过Vector已经很少使用了。
Set
Set的特点如下:
- 元素不可重复
Set的基础数据结构是Map, 因为MapEntry中key的值必须唯一,所以Set中的value存储在MapEntry中的key处,而忽略MapEntry中的value,通过这种方式达到Set中元素无重复。
实现类(均线程不安全): HashSet, LinkedHashSet, TreeSet。
HashSet
- 基础数据结构是HashTable。
- 不保证元素的顺序。
- 实现类中性能最好。
LinkedHashSet
- 基础数据结构是HashTable。
- 保证元素的顺序(按照插入的元素的顺序排序)。
TreeSet
- 基础数据结构是Red-Black Tree。
- 保证元素的顺序(按照插入的元素的值)。
- 比HashSet慢很多。
Map
Map的特点如下:
- 把Key映射成Value。
- Key不可重复。
实现类: HashMap, HashTable, TreeMap。
HashMap
- 不保证插入的顺序。
- Key可为null
- 线程不安全。
HashTable
- 不保证插入的顺序。
- Key不可为null
- 与HashMap的一个重要差别就是HashTable是线程安全的。
- 现在已经很少使用HashTable了。
TreeMap
- 基础数据结构是红黑树。
- Key可为null
- 保证元素的顺序(可以指定排序规则)。
- 线程不安全。
Summary
ArrayList, LinkedList和Vector
- 如果元素数目固定不变,使用Array。
- 如果元素数目会变化:
- 访问/查询 操作频繁,且不用考虑线程安全,使用ArrayList。
- 插入/删除 操作频繁,且不用考虑线程安全,使用LinkedList。
- 考虑线程安全,请使用 java.util.concurrent 包下的线程安全集合类。
- Vector类已很少使用。
HashSet/HashMap和TreeSet/TreeMap
- 希望元素有序,请使用TreeSet/TreeMap。
- 否则还是使用HashSet/HashMap,效率比较好。
- 考虑线程安全,请使用 java.util.concurrent 包下的线程安全集合类。