集合大纲
JAVA集合类主要由两个根接口Collection和Map派生出来的。
1. 常用集合分类
Collection接口 对应的对象集合
- List接口:元素有序保存,可以存储重复元素
- LinkedList 接口实现类:链表类型,查询慢,增删快,没有同步,线程不安全,效率高
- ArrayList 接口实现类:数组类型,查询快,增删慢,没有同步,线程不安全,效率高
- Vector 接口实现类:数组类型,查询快,增删慢,同步,线程安全,效率低
- Stack 是Vector类的实现类
- Set 接口:仅接收一次,不可重复,并在内部排序
- HashSet 使用hash表(数组)存储元素
- LinkedHashSet 链表维护元素的插入次序
- TreeSet 底层实现为二叉树,元素为排好序的
- HashSet 使用hash表(数组)存储元素
Map 接口 key-value 结合
- Hashtable 接口实现类:同步,线程安全
- HashMap 接口实现类,没有同步,线程不安全
- LinkedHashMap 双向链表和哈希表实现
- WeakHashMap
- TreeMap 红黑树对所有的key进行排序
- IdentifyHashMap
List 和 Set比较
Collection 工具类
如何选择集合
6.1 List
- 随机查询或者迭代遍历操作,数组比容器速度快。所以随机访问一般采用ArrayList。
- LinkedList 使用双向链表对元素进行增加和删除操作提供了很好的支持,而ArrayList执行增删操作需要对元素进行移位。
- 对于Vector,我们一般避免使用,效率低。
- 将ArrayList作为首选,毕竟对于集合元素我们都是进行遍历,只有当程序性能因为List的频繁插入和删除而降低时,我们采用LinkedList。
6.2 Set
- HashSet由于使用HashCode实现,所以在某种程度上来说他的性能永远比TreeSet要好,尤其是进行增加和查找操作。
- 虽然TreeSet并没有HashSet性能好,但是它可以维护元素的排序。
6.3 Map
- HashMap 与HashSet 同样,支持快速查询。虽然HashTable速度也不慢,但是跟HashMap相比还有略微差,所以HashMap在查询方面可以取代HashTable。
- 由于TreeMap需要维护元素内部的顺序,所以它通常要比HashMap和HashTable速度慢。