您的位置:首页 > 编程语言 > Java开发

Java集合框架

2015-07-22 20:52 375 查看
  在Java语言中,Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(具体实现接口的类)。所有抽象出来的数据结构和操作(算法)统称为Java集合框架(Java Collection Framework)。

    Java程序员在具体应用时,不必考虑数据结构和算法实现细节,只需要用这些类创建出来一些对象,然后直接应用就可以了。这样就大大提高了编程效率。

   Java类集框架的优势:

        1) 这种框架是高性能的。对基本类集(动态数组,链接表,树和散列表)的实现是高效率的。一般很少需要人工去对这些“数据引擎”编写代码(如果有的话)。

        2) 框架允许不同类型的类集以相同的方式和高度互操作方式工作。

        3) 类集是容易扩展和/或修改的。为了实现这一目标,类集框架被设计成包含一组标准的接口。对这些接口,提供了几个标准的实现工具(例如LinkedList,HashSet和 TreeSet),通常就是这样使用的。如果你愿意的话,也可以实现你自己的类集。为了方便起见,创建用于各种特殊目的的实现工具。一部分工具可以使你自己的类集 实现更加容易。

        4) 增加了允许将标准数组融合到类集框架中的机制。

  java集合框架整体结构如下图所示:

 

  


   集合框架概述:

  java中集合类集定义在java.util包下,Collection接口是构造类集框架的基础,它声明所有类集将拥有的核心方法。

  最常用的接口有:
List——有序集合
Set——无序集合
Map——映射关系的集合数据结构

  另外还有Queue接口,它提供了基于队列的集合体系。每种集合都可以理解为用来在内存中存放一组对象的某种”容器“。
  集合框架详解

  Collection接口:

    Collection是java集合框架最基本的接口。所有实现Collection接口的类都必须提供两个标准的构造函数,无参的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一  个新的Collection,与传入的Collection有相同的元素。

    遍历集合使用迭代器。例如:

Interator it=collection.interator();//得到集合的迭代器
while(it,hasNext()){
Object obj=ir.next();//得到下一个对象
}


  Collection派生的常用子接口有List,Set,Queue。

  Collections是集合类,提供了很多静态方法来管理集合。

  Collection常用方法如下所示:  


COllection方法

 

  List接口:

  List是有序集合,可以对列表中的每个元素的插入位置进行精确的控制,用户可以根据索引进行访问。List允许重复元素,即满足e1.equals(e2);

  List除了Collection必备的iterator方法外,还有一个ListIterator方法。与标准的Iterator接口相比,ListIterator多了一些方法,允许添加,删除,修改元素,以及前后遍历。

  实现List接口的常用类有:LinkedList,ArrayList,Vector,Stack。

  List接口常用方法如下所示:


List接口方法

  ArrayList类:

  ArrayList实现了可变大小的数组,允许所有元素(包括null),允许元素重复,ArrayList没有实现线程同步。

  ArrayList使用一个内置的数组来存储元素,每个ArrayList实例都有一个初始容量(Capacity)10,容量可以随着添加新元素而不断增长,公式如下:Capacity=(Capacity*3)/2+1,每次增长容量50%。在插入大量元素前,可以调用ensureCapacity方法来增加ArrayList容量,以提高插入效率。

  对数组进行重新分配大小时,会导致性能下降,(当有大量元素时)会浪费大量存储空间。如果我们知道有多少元素,可以通过构造函数指定容量。我们也可以使用trimToSize方法在ArrayList重新分配容量后去掉浪费的存储空间。

  LinkedList类:

  LinkedList是List接口的链表实现,允许所有元素(包括null),允许元素重复,ArrayList没有实现线程同步。

  LinkedList在列表的开头和结尾提供了额外的get,remove和insert方法,这些操作将允许列表用作堆栈(Stack),队列(Queue)或双端队列(Deque)。

  LinkedList实现了Queue接口,提供了add,pull等方法供队列操作。

  LinkedList没有实现同步,但可以在创建时实现一个同步列表,例如:

   List list=Collections.synchronizedList(new LinkedList());

  LinkedList方法如下所示:


View
Code

  Vector类:

  Vector类十余ArrayL,但Vector是线程同步的。当一个Iterator被创建而且正在使用时,另外一个线程改变了vector的状态。这时调用Iterator的方法,将抛出ConcurrentModificationException异常,因此必须捕获异常。

  Vector方法:


Vector方法

 

  Stack类:

  Stack类继承自Vector,他实现了一个先进后出的栈。Stack提供了五个额外的方法使得Vector被当做堆栈使用,push,pop,peek,search,empty。

  Stack方法:


Stack方法

 

  Set接口:

  Set是无序集合,不包括重复元素,及e1.equals(e2)==false,最多含有一个null。

  常用的子类有HashSet,TreeSet。

     Set接口方法列表如下所示:  


Set方法列表

 

  HashSet类:

  HashSet实现Set接口,由哈希表支持(实际上是一个HashMap实例),不保证集合的迭代顺序,它是基于HashMap实现,底层使用HashMap保存所有元素,基本上都是直接调用底层HashMap的相关方法实现。

  HashSet方法:


HashSet方法

  Map接口:

  Map接口没有继承Collection接口,Map提供Key到value的关系映射。Map中不能含有重复的Key,每个key只能映射一个value。Map是Dictionary(字典)的替代品,Map提供了三种集合视图:键集,值集和键值映射关系集的形式来查看映射的内容。

  常用的子类有:HashMap。TreeMap,子接口有SortedMap。

  方法列表:


Map方法

  HashMap类:

  基于哈希表的Map接口实现,非线程同步,提供所有可选的映射操作,允许null键值,不保证映射顺序。

  TreeMap:

  基于红黑树的SortedMap接口实现,保证映射按照升序排列关键字,根据使用的构造方法不同,可能会按不同的方法排序。


TreeMap方法

 

  HashTable:

  不允许null键值,线程同步,其他类似于HashMap。

 

  总结:

  如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素, 

应该使用ArrayList。  

  如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该 

使用同步的类。  

  要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。  

  尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。 

这就是针对抽象编程 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: