Java 集合框架(常用数据结构)
早在Java 2中之前,Java就提供了特设类。比如:向量(Vector)、栈(Stack)、字典(Dictionary)、哈希表(Hashtable)这些类(数据结构)用来存储和操作对象组。虽然这些类都非常有用,但是它们缺少一个核心的,统一的主题。集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。除了集合,该框架(framework)也定义了几个Map接口和类。Map里存储的是键/值对。尽管Map不是collections,但是它们完全整合在集合中。
所有的集合框架都包含如下内容:
- 接口:是代表集合的抽象数据类型。接口允许集合独立操纵其代表的细节。在面向对象的语言,接口通常形成一个层次。
 - 实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构。
 - 算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。
 集合框架的类和接口均在java.util包中。
下图是简化的集合框架关系图:

集合接口
整个集合框架就围绕一组标准接口而设计。你可以直接使用这些接口的标准实现,诸如: LinkedList, HashSet, 和 TreeSet等,除此之外你也可以通过这些接口实现自己的集合。具体接口及其概述如下:
| 名称 | 概述 | 
|---|---|
| Collection | Collection 是最基本的集合接口,一个 Collection 代表一组 Object,Java不提供直接继承自Collection的类,只提供继承于的子接口(如List和set)。 | 
| List | List接口是一个有序的Collection,使用此接口能够精确的控制每个元素插入的位置,能够通过索引(元素在List中位置,类似于数组的小标)来访问List中的元素,而且允许有相同的元素。 | 
| Set | Set 具有与 Collection 完全一样的接口,只是行为上不同,Set 不保存重复的元素。 | 
| SortedSet | 继承于Set保存有序的集合。 | 
| Map | 将唯一的键映射到值。 | 
| Map.Entry | 描述在一个Map中的一个元素(键/值对)。是一个Map的内部类。 | 
| SortedMap | 继承于Map,使Key保持在升序排列。 | 
| Enumeration | 这是一个传统的接口和定义的方法,通过它可以枚举(一次获得一个)对象集合中的元素。这个传统接口已被迭代器取代。 | 
更多参见:在线文档-jdk-zh。
集合实现类
| 集合类型 | 描述 | 
|---|---|
| ArrayList | 一种可以动态增长和缩减的索引序列 | 
| LinkedList | 一种可以在任何位置进行高效地插入和删除操作的有序序列 | 
| ArrayDeque | 一种用循环数组实现的双端队列 | 
| HashSet | 一种没有重复元素的无序集合 | 
| TreeSet | 一种有序集 | 
| EnumSet | 一种包含枚举类型值的集 | 
| LinkedHashSet | 一种可以记住元素插入次序的集 | 
| PriorityQueue | 一种允许高效删除最小元素的集合 | 
| HashMap | 一种储存键/值关联的数据结构 | 
| TreeMap | 一种键值有序排列的映射表 | 
| EnumMap | 一种键值属于枚举类型的映射表 | 
| WeakHashMap | 一种其值诶用武之地后可以被垃圾回收器回收的映射表 | 
| LinkedHashMap | 一种可以记住键/值项添加次序的映射表 | 
| IdentityHashMap | 一种用==,而不是用equals比较键值的映射表 | 
另外还有一组名字以Abstract开头的类,例如,AbstractQueue,这些类是为类库实现者而设计的,用来实现自己的数据结构。
常用数据结构
向量(Vector)
Vector类实现了一个动态数组。和ArrayList和相似,但是Vector是同步访问的(同步操作会耗费大量时间,建议在不需要同步时使用ArrayList),而且Vector包含了许多传统的方法,这些方法不属于集合框架。Vector主要用在事先不知道数组的大小,或者只是需要一个可以改变大小的数组的情况。需要注意的是向量中的数据被转化为Object对象,取出元素使用时要强制转化为原来的类型。
Vector类支持4种构造方法:
Vector(); //默认大小为10 Vector(int size); //创建指定大小的向量 Vector(int size,int incr); //指定大小和增量,增量表示向量每次增加的元素数目 Vector(Collection c); //创建一个包含集合c元素的向量
常用方法:
| 方法 | 描述 |
|------|------|
|  boolean	add(E e) | 将指定元素添加到此向量的末尾。 |
| void	add(int index, E element) | 在此向量的指定位置插入指定的元素。  |
|  E	remove(int index) |移除此向量中指定位置的元素。 |
| boolean	remove(Object o) | 移除此向量中指定元素的第一个匹配项,不包含则元素保持不变。 |
|  E	set(int index, E element)  | 用指定的元素替换此向量中指定位置处的元素。 |
| void	setElementAt(E obj, int index) | 将此向量指定 index 处的组件设置为指定的对象。 |
|  E get(int index) | 返回向量中指定位置的元素。 |
| int	indexOf(Object o) | 返回此向量中第一次出现的指定元素的索引,不包含则返回 -1。 |
|  boolean	isEmpty() | 测试此向量是否不包含组件。 |
| void	clear() | 从此向量中移除所有元素。 |
| int	capacity() | 返回此向量的当前容量。 |
| boolean	contains(Object o) | 如果此向量包含指定的元素,则返回 true。 |
| void	setSize(int newSize) | 设置此向量的大小。 |
|  void	trimToSize()  | 对此向量的容量进行微调,使其等于向量的当前大小。 |
>
>Vector还定义了很多其他方法,具体可以看:[Java Vector 类](http://www.runoob.com/java/java-vector-class.html)。
哈希表(Hashtable)
Hashtable(确实是小写的t)是原始的java.util的一部分, 是一个Dictionary具体的实现 。然而,Java 2 重构的Hashtable实现了Map接口,因此,Hashtable现在集成到了集合框架中。它和HashMap类很相似,但是它支持同步(同样建议不需要同步时使用HashMap)。像HashMap一样,Hashtable在哈希表中存储键/值对。当使用一个哈希表,要指定用作键的对象,以及要链接到该键的值。然后,该键经过哈希处理,所得到的散列码被用作存储在该表中值的索引。
Hashtable定义了四个构造方法:
Hashtable(); //默认的初始容量 (11) 和加载因子 (0.75) Hashtable(int initialCapacity); //指定初始容量和默认的加载因子 (0.75) Hashtable(int initialCapacity, float loadFactor); // Hashtable(Map m); //以M中元素为初始化元素,哈希表的容量为M的两倍。
如果散列表的装载因子是0.75,那么当散列表的容量被使用了75%时,就会自动将容量增加到原始容量的2倍。通常,默认加载因子(0.75)在时间和空间成本上寻求一种折中,装载因子过高虽然减少了空间开销,但同时也增加了查找某个条目的时间。
常用方法:
| 方法 | 描述 |
|-----|------|
|  V put(K key, V value) | 将指定 key 映射到此哈希表中的指定 value。 |
|  V remove(Object key) | 从哈希表中移除该键及其相应的值。|
| V	get(Object key) | 返回指定键所映射到的值,不包含则返回 null。 |
| void	clear() | 将此哈希表清空,使其不包含任何键。 |
|  boolean	containsValue(Object value) | 如果此 Hashtable 将一个或多个键映射到此值,则返回 true。 |
|  boolean	isEmpty() | 测试此哈希表是否没有键映射到值。 |
| int size() | 返回此哈希表中的键的数量。 |
| void	rehash() | 增加此哈希表的容量并在内部对其进行重组,以便更有效地容纳和访问其元素。 |
>
>Hashtable中还定义了一些其他方法,具体可以看:[Java HashTable 接口](http://www.runoob.com/java/java-hashTable-class.html)。
栈(Stack)
栈是Vector的一个子类,它实现了一个标准的后进先出的栈。堆栈只定义了默认构造函数,用来创建一个空栈。 堆栈除了包括由Vector定义的所有方法,也定义了自己的一些方法,如下:
| 方法 | 描述 |
|------|------|
| boolean empty() | 测试堆栈是否为空。 |
| Object peek( ) | 查看堆栈顶部的对象,但不从堆栈中移除它。 |
| Object pop( ) | 移除堆栈顶部的对象,并作为此函数的值返回该对。 |
| Object push(Object element) | 把项压入堆栈顶部。 |
| int search(Object element) | 返回对象在堆栈中的位置,以 1 为基数。 |
>但是Deque **接口**及其实现提供了 LIFO 堆栈操作的更完整和更一致的 set,应该优先使用此 set,而非此类。
>
>注:Java 中 Queue 是接口, Deque 是其子接口,LinkedList 和 PriorityQueue 是其实现类,而 ArrayDeque 是 Deque 接口的实现类。具体方法可以查看:[JDK 1.6 在线中文手册](http://www.runoob.com/manual/jdk1.6/)。
链表(LinkedList)
LinkedList是一个双端链表,存放在结点中的数据都被看作是一个Object对象。由于任何类都是Object类的间接子类,因此,可以把任何一个对象作为链表结点中的数据。需要注意的是get()方法返回的类型是Object,要类型转换回原来的类型。
构造方法:LinkedList(); //构造一个空列表 LinkedList(Collection<? extends E> c); //包含指定 collection 中的元素
常用方法:
| 方法 | 描述 |
|------|-----|
| boolean add(E e) | 将指定元素添加到此列表的**结尾**。 |
| void add(int index, E element) | 在此列表中指定的位置插入指定的元素。 |
| E remove(int index) | 移除此列表中指定位置处的元素。 |
|  E remove() | 获取并移除此列表的头(第一个元素)。 |
| boolean remove(Object o) | 移除首次出现的指定元素,不包含则不作更改。|
| E set(int index, E element) | 将此列表中指定位置的元素替换为指定的元素。 |
|  E get(int index) | 返回此列表中指定位置处的元素。**效率低**,并非随机访问。 |
| int indexOf(Object o) | 返回此列表中首次出现的指定元素的索引,不存在则返回-1. |
| boolean contains(Object o) | 至少包含一个指定元素,则返回 true。 |
| int size() | 返回此列表的元素数。 |
| void clear() | 从此列表中移除所有元素。 |
| Object clone() | 返回此 LinkedList 的浅表副本。(这些元素本身没有复制。) |
| Object[] toArray() | 此方法返回一个新数组,调用者可以随意修改。 |
>LinkedList也实现了Deque接口,List接口和Queue接口,存在方法支持其用作堆栈、队列或双端队列,这里不做展开,具体方法可以查看:[JDK 1.6 在线中文手册](http://www.runoob.com/manual/jdk1.6/)。
参考资料
- 实验楼:JDK 核心 API
 - Java核心技术 卷Ⅰ基础知识 原书第8版
 - 菜鸟教程:Java 集合框架、Java 数据结构
 - Java2实用教程 (第三版)_ 耿祥义,张跃平
 
Java 集合框架(常用数据结构)的更多相关文章
- 一起学 Java集合框架、数据结构、泛型
		
一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...
 - JAVA之旅(十八)——基本数据类型的对象包装类,集合框架,数据结构,Collection,ArrayList,迭代器Iterator,List的使用
		
JAVA之旅(十八)--基本数据类型的对象包装类,集合框架,数据结构,Collection,ArrayList,迭代器Iterator,List的使用 JAVA把完事万物都定义为对象,而我们想使用数据 ...
 - 一起学 Java(三) 集合框架、数据结构、泛型
		
一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...
 - Java集合框架(常用类) JCF
		
Java集合框架(常用类) JCF 为了实现某一目的或功能而预先设计好一系列封装好的具有继承关系或实现关系类的接口: 集合的由来: 特点:元素类型可以不同,集合长度可变,空间不固定: 管理集合类和接口 ...
 - 处理异常、常用类、反射、类加载与垃圾回收、java集合框架
		
异常处理概述 检查异常:检查异常通常是用户错误或者不能被程序员所预见的问题.(cheched) 运行时异常:运行时异常是一个程序在运行过程中可能发生的.可以被程序员避免的异常类型.(Unchecked ...
 - Java集合框架之四大接口、常用实现类
		
Java集合框架 <Java集合框架的四大接口> Collection:存储无序的.不唯一的数据:其下有List和Set两大接口. List:存储有序的.不唯一的数据: Set:存储无序的 ...
 - Java 集合框架
		
Java集合框架大致可以分为五个部分:List列表,Set集合.Map映射.迭代器.工具类 List 接口通常表示一个列表(数组.队列.链表 栈),其中的元素 可以重复 的是:ArrayList 和L ...
 - 【JAVA集合框架之Map】
		
一.概述.1.Map是一种接口,在JAVA集合框架中是以一种非常重要的集合.2.Map一次添加一对元素,所以又称为“双列集合”(Collection一次添加一个元素,所以又称为“单列集合”)3.Map ...
 - 【JAVA集合框架之List】
		
一.List接口概述. List有个很大的特点就是可以操作角标. 下面开始介绍List接口中相对于Collection接口比较特别的方法.在Collection接口中已经介绍的方法此处就不再赘述. 1 ...
 
随机推荐
- Linux Directory Structure
			
Note: Files are grouped according to purpose. Ex: commands, data files, documentation. Parts of a Un ...
 - jdbc oracle clob
			
import java.io.BufferedReader; import java.io.Reader; import java.io.Writer; import java.sql.Callabl ...
 - Flex4 初始化过慢解决方法
			
昨天找了个免费.net空间,想测试一下做的一个简单Flex4 上传项目的效果.上传所有文件到网站之后,访问项目页面,进度条一点一点艰难的向前移动,到了100%后却不出现程序界面,等待一会儿还是没有出现 ...
 - Connection to https://dl-ssl.google.com refused的解决办法
			
使用SDK Manager.exe安装Android开发环境的时候会遇到: Fetching https://dl-ssl.google.com/android/repository/addons_l ...
 - 十:audio 音频
			
属性名 类型 默认值 说明 id String video 组件的唯一标识符 src String 要播放音频的资源地址 loop Boolean false 是否循环播放 controls ...
 - unity 和 iOS/Android 信息交互(方法调用)
			
参考文章均来源于[大神雨松momo]的文章. unity -> iOS // unity 程序 usingSystem.Runtime.InteropServices; usingUnityEn ...
 - DateGridView 分页显示
			
l 思路:将数据表整体填充至一个Dataset中,探后部分显示(DataaAdapter Fill重载) l DataGridView 控件 l BindingNavigator 控件 l B ...
 - ssm集成redis
			
身在一个传统的IT公司,接触的新技术比较少,打算年后跳槽,所以抽空学了一下redis. 简单的redis测试,咱们这边就不讲了,现在主要讲讲ssm集成redis的过程,因为现在项目用的就是ssm的框架 ...
 - 从MySQL到ORM(二):MySQL基础
			
一.基本概念 1.数据库: 数据库(DataBase)就是一个存储数据的仓库,为了方便数据的存储和管理,它将数据按照特定的规律存储在磁盘上.通过数据库管理系统,可以有效的组织和管理存储在数据库中的数据 ...
 - Win10系统安装vmware workstation 12后没有桥接网卡怎么办
			
原文 vmware workstation是一款虚拟机计算机软件,可以同时运行不同的操作系统,然而有win10系统用户在安装vmware workstation 12之后,却发现网络连接里面没有桥接网 ...