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有相同的元素。
遍历集合使用迭代器。例如:
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时,客户端代码不用改变。
这就是针对抽象编程
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时,客户端代码不用改变。
这就是针对抽象编程
相关文章推荐
- Java对象生命周期
- Java各种Synchronizer: CountDownLatch, CyclicBarrier,Semaphore
- Java图形界面编程生成exe文件
- Java图形界面编程生成exe文件
- java数组--04
- Eclipse Java注释模板设置详解
- myeclipse里面新建java程序运行时总会出现无法找到主函数问题
- 如何为Eclipse设置代理
- Java Log4j打印在WebRoot/log/
- Java中用final修饰的变量
- java中选择组合或继承的依据
- 最新Spring集成MyBatis详细教程(一)--ccw
- java GC性能优化
- java中如何终止线程
- 《深入浅出struts2》--第五章,表单标签
- 《深入理解Java虚拟机》:HotSpot虚拟机内的即时编译器
- 【JAVA基础】增,删,改,查
- java中的异常
- Eclipse. The archive which is referenced by the classpath, does not exist
- bj java 初学2015-07-22