码迷,mamicode.com
首页 > 编程语言 > 详细

Java集合框架

时间:2015-08-12 01:01:21      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:

 Java集合框架实现了常用的基本数据结构,如:集合、线性表、队列、栈、映射表等。

 下图是集合框架的类关系图:

 

技术分享

 

  Java集合框架主要由Collection接口和Map接口构成,Collection接口有子接口List、Set、Queue接口。常用的集合类有:ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等,还有一些遗留的早期版本的集合类,如:Vector、Stack、HashTable等。

 

1. 线性表

 线性表有两种实现形式,一种是可以随机访问的顺序表ArrayList,另一种是链式表LinkedList。

 ArrayList是顺序表,可以随机访问元素,访问元素效率较高,但删除元素需要移动大量元素,效率较低;

 LinkedList是双向链表,可以方便的删除元素,但访问元素效率较低,需要遍历链表;

 

2. 队列

 Java中的队列比较灵活,是双端队列,即在队列的头和尾都可以添加和删除元素。

 队列也有两种实现形式,一种是顺序队列ArrayQueue,另一种是链式队列LinkedList,LinkedList实现了Deque接口,可以作为链式表也可以作为链式队列。

 Java还提供了一个实现优先级队列的类PriorityQueue,PriorityQueue类在删除队头元素时,总是删除最小的元素。PriorityQueue并没有对元素进行排序,而是采用堆的方式来实现每次返回最小元素。PriorityQueue要求插入的元素实现Comparable接口。

 

3. 栈

 栈使用Stack类来实现,而Stack继承自Vector类,因此Java中的栈实际上不仅可以在栈顶进行操作,还可以在任意位置删除或者添加元素。

 

4. 集合

 集合表示不允许出现重复元素的数据集,由HashSet类和TreeSet类实现。

 HashSet是使用哈希表结构来实现的,哈希表的结构如下图所示:

 

技术分享

 

 Java中哈希表使用链表数组来实现,每个链表被称为桶,每个桶可以存放若干元素。向HashSet添加元素s时将元素的hashCode散列,选中某个桶来保存s,若该桶中没有元素,则直接添加s到桶中,若桶中有元素,则需要遍历桶中的元素并进行比较,若没有与s相同的元素则添加s到桶中。

  TreeSet也是基于哈希表的结构,它除了像HashSet一样保证没有重复的元素,还在所有元素之间建立关系,使用红黑树来对集合中的元素进行排序,因此可以按照排序后的顺序来遍历TreeSet中的元素。

 

5. 映射表(Map)

  映射表用来保存键值对,Java中使用Map接口来定义映射表的操作,需要注意的是Map接口没有继承自Collection接口。映射表由HashMap类和TreeMap类实现。

  HashMap类似于HashSet,使用哈希表的结构来实现,只是链表中保存的是键值对,即Java中的Map.Entry<K,V>类表示。向HashMap中添加键值对<k,v>时,对k进行散列,选择保存<k,v>的桶,若桶中没有与k对应的键值对,则直接插入,否则用新的v替换原来的旧值。

  TreeMap和TreeSet类似,按照键对映射表中的元素进行排序。

  映射表可以返回3个视图:键集、值集、键值对集,分别由以下三个方法返回:

     Set<K>   keySet();

     Collection<V> values();

     Set<Map.Entry<K,V>>  entrySet();

  注意上面返回的Set对象既不是HashSet也不是TreeSet,而是实现了Set接口的另外一个类的对象,这个类屏蔽了一些该视图上不该有的功能。

 

6. LinkedHashSet和LinkedHashMap

  LinkedHashSet和LinkedHashMap可以记住插入元素的顺序,可以按照插入元素的顺序遍历,实际上是在哈希表结构中的所有元素上建立了一个链表来保存元素之间的顺序关系。

  LinkedHashMap还可以选择记住访问元素的顺序,只要创建LinkedHashMap对象时设置参数accessOrder为true。每次对元素的get或者put都会导致该元素在保存顺序关系的链表中的位置变成末尾,该元素在桶中的实际位置没有变化。这样使用迭代器迭代LinkedHashMap中的元素时,排在前面的元素就是”最近最少使用“的元素,因此LinkedHashMap可以用来实现高速缓存结构。

 

7. Vector与ArrayList、Hashtable与HashMap

  Vector类和Hashtable(注意不是HashTable)类是早期版本中遗留下来的类。

  Vector类和ArrayList类相似,Vector类的方法都是同步的,因此是线程安全的,Hashtable类和HashMap类相似,Hashtable类也是线程安全的。

Java集合框架

标签:

原文地址:http://www.cnblogs.com/jqctop1/p/4722648.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!