Collection & Collections Part 1/2: Collection

Collection & Collections Part 1/2: Collection

目录


Overview

Collection和Collections是刚开始学习Java时容易混淆的两个”类”。

  • Collection是一个接口,供各集合类实现。
  • Collections是一个类,里面的方法都是static的,它是一个工具类,所有的方法都对Collection进行操作。

之前几篇博文已经详细阅读了ArrayList,LinkedList,HashSet以及HashMap的源码,这篇博文总结下Collection类。

Collection家族的族谱如下:

Collection


List

List可以看做更灵活的数组,特点如下:

  1. 元素有序
  2. 元素可重复
  3. 元素可以通过在List中的位置(索引)进行访问插入

实现类: ArrayList, LinkedList, Vector。

  • ArrayList
    • 基础数据结构是数组。
    • 可以根据存储元素的数量自动地伸缩自身的size。
    • 由于数组中元素的插入删除涉及到大量元素的前移或后移,效率不高,此时最好不要用ArrayList;由于数组中元素可以根据索引直接找到,所以访问的效率很高,此时推荐使用ArrayList。
    • 线程不安全,多线程环境不推荐使用。
  • LinkedList

    • 基础数据结构是链表
    • LinkedList实现了Stack, Queue(Deque)的功能。
    • 由于链表中元素的访问需要从表头开始遍历,时间复杂度为O(N),所以此时最好不要用LinkedList;由于链表中的元素的插入删除只需改变指针的指向,O(1)即可完成,此时推荐使用LinkedList。
    • 线程不安全,多线程环境不推荐使用。
  • Vector

    • 基础数据结构也是数组。
    • 与ArrayList一样,不适用元素的插入删除,适用于元素的访问
    • 线程安全,不过Vector已经很少使用了。

Set

Set的特点如下:

  1. 元素不可重复

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的特点如下:

  1. 把Key映射成Value。
  2. 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 包下的线程安全集合类。
posted @ 2016-06-01 14:28  1202zhyl  阅读(132)  评论(0编辑  收藏  举报