转自:http://www.cnblogs.com/skywang12345/p/3308498.html
http://www.cnblogs.com/hzmark/archive/2012/12/17/CollectionBase.html
Java集合是java提供的工具包,包含了常用的数据结构:集合、链表、队列、栈、数组、映射等。Java集合工具包位置是java.util.*
Java集合主要可以划分为4个部分:List列表、Set集合、Map映射、工具类(Iterator迭代器、Enumeration枚举类、Arrays和Collections)。
Java集合工具包框架图(如下):
大致说明:
看上面的框架图,先抓住它的主干,即Collection和Map。
1 Collection是一个接口,是高度抽象出来的集合,它包含了集合的基本操作和属性。
Collection包含了List和Set两大分支。
(01) List是一个有序的队列,每一个元素都有它的索引。第一个元素的索引值是0。
List的实现类有LinkedList, ArrayList, Vector, Stack。
(02) Set是一个不允许有重复元素的集合。
Set的实现类有HastSet和TreeSet。HashSet依赖于HashMap,它实际上是通过HashMap实现的;TreeSet依赖于TreeMap,它实际上是通过TreeMap实现的。
2 Map是一个映射接口,即key-value键值对。Map中的每一个元素包含“一个key”和“key对应的value”。
AbstractMap是个抽象类,它实现了Map接口中的大部分API。而HashMap,TreeMap,WeakHashMap都是继承于AbstractMap。
Hashtable虽然继承于Dictionary,但它实现了Map接口。
接下来,再看Iterator。它是遍历集合的工具,即我们通常通过Iterator迭代器来遍历集合。我们说Collection依赖于Iterator,是因为Collection的实现类都要实现iterator()函数,返回一个Iterator对象。
ListIterator是专门为遍历List而存在的。
再看Enumeration,它是JDK 1.0引入的抽象类。作用和Iterator一样,也是遍历集合;但是Enumeration的功能要比Iterator少。在上面的框图中,Enumeration只能在Hashtable, Vector, Stack中使用。
最后,看Arrays和Collections。它们是操作数组、集合的两个工具类。
因为ArrayList底层由数组实现,在0号位置插入时将移动list的所有元素,在末尾插入元素时不需要移动。LinkedList是双向链表,在任意位置插入元素所需时间均相同。所以在List中有较多插入和删除操作的情况下应使用LinkedList来提高效率,而有较多索引查询的时候使用ArrayList(使用增强型的for循环或Iterator遍历LinkedList效率将提高很多)。
List、Set、Map接口及各实现类的特性
接口 | 特性 | 实现类 | 实现类特性 | 成员要求 |
List | 线性、有序的存储容器,可通过索引访问元素 | ArrayList | 数组实现。非同步。 |
|
Vector | 类似ArrayList,同步。 |
| ||
LinkedList | 双向链表。非同步。 |
| ||
Map | 保存键值对成员 | HashMap | 基于哈希表的 Map 接口的实现,满足通用需求 | 任意Object对象,如果修改了equals方法,需同时修改hashCode方法 |
TreeMap | 默认根据自然顺序进行排序,或者根据创建映射时提供的 Comparator进行排序 | 键成员要求实现caparable接口,或者使用Comparator构造TreeMap。键成员一般为同一类型。 | ||
LinkedHashMap | 类似于HashMap,但迭代遍历时取得“键值对”的顺序是其插入顺序或者最近最少使用的次序 | 与HashMap相同 | ||
IdentityHashMap | 使用==取代equals()对“键值”进行比较的散列映射 | 成员通过==判断是否相等 | ||
WeakHashMap | 弱键映射,允许释放映射所指向的对象 |
| ||
ConcurrentHashMap | 线性安全的Map |
| ||
Set | 成员不能重复 | HashSet | 为快速查找设计的Set | 元素必须定义hashCode() |
TreeSet | 保持次序的Set,底层为树结构 | 元素必须实现Comparable接口 | ||
LinkedHashSet | 内部使用链表维护元素的顺序(插入的次序) | 元素必须定义hashCode() |