集合框架
(Collection)
可以说软件编程中过程中极其重要的一个概念
,
为什么我这里要用“极其”这个词呢?就是因为在我的
14
个项目研发经验中,几乎每个项目都需要使用集合框架,如果用好了集合框架,那么整个项目将会变得非常灵活,因此在我
Softworks中心
的培训经历中,我也非常注重对于这个概念的培训。其实比较喜欢在网上浏览技术的同学可能知道,网上有比较流行的
32
道经典
Java
面试考题,在这些考题中就有很多是用来考察学员对于集合框架的理解程度的。
在授课的过程中,我借助了《人月神话》中的
5W1H
的学习分析方法对于集合框架进行了介绍:
1
.
What
:什么是集合框架,集合框架其实就是一个“垃圾桶”,因为任意对象都可以放入集合框架中。由于数组存在比较明显的缺陷(例如:一次声明所产生的数据类型必须是一致的,数据地址必须是连续的,数组长度是定长的等等),而集合框架比数组更灵活更实用,甚至可以将集合框架中的某些部分理解为数组的包装类。
2
.
Why
:
集合框架比数组来的更灵活,可以说集合框架完全弥补了数组的一些缺点,虽然操作效率没有数组那么高,但是却可以大大提高软件的开发效率,而且不同的集合框架类可以适用于不同的场合。
3
.
Where
:我们在项目的任何一个角落中都可以使用集合框架,例如,现在我们有
2
个实体类:顾客类
(Customer)
和订单类
(Order)
,根据现实情况我们可以明确,一个顾客拥有多张订单,而一个订单只能隶属于一个客户,这个时候由于客户包含了多张订单,那么顾客类就可以用集合框架来存放所有的订单对象了。
4
.
When
:集合框架顾名思义就是某些相关数据的整合个体,那么当我们需要将一些相同特性的个体整合或者说绑定在一起的时候,就可以考虑使用集合框架了,因为集合框架可以保存和帮定这样一些数据。
5
.
Who
:
所有的
Java,.Net
程序员都可以使用集合框架,因为现今的面向对象的高级编程语言都提供了集合框架的处理类。
6
.
How
:在理解了集合框架的意义以后我们来看看如何来使用集合框架
SUN
为我们提供了功能强大的
JDK(1.5)
因此我们可以通过
java.util
包中看到几乎所有的集合框架类,在讲解具体的集合框架之前我们来看看一些常用的集合类之间的关联关系
:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/frank_softworks/450f064a6b1a486b88492aab1f767c69.jpg)
通过上图我们可以看到常用的集合框架的继承支线,黑色的空心三角箭头表示的是接口之间的继承关系,而红色的空心箭头表示的是类对于接口的实现,就我个人的教学经验而言,我比较喜欢的是对比教学法,通过不同的对比教学来阐述类,接口之间的关系和区别,现在叙述如下:
List
接口和
Set
接口的区别在于,
List
接口可以顺序存放数据,并且数据是允许重复的,而
Set
接口正好与
List
接口相反,不能顺序存放数据,也不能存放相同数据。
Map
接口和
Set
接口基本类似,最大的区别在于
Map
接口要求使用
Key-Value
映射关系来存放数据,
Map
要保证
Key
在集合中是唯一不能重复的。
ArrayList
和
LinkedList
所实现的功能完全一样,但是他们在数据结构上有比较明显的区别
ArrayList
的内部组成是动态数组,因此他的取值速度比较快,而
LinkedList
的内部组成是单链表,所以对于集合增,删,改的速度比较快。
SUN
之所以这么设计就是为了使集合框架能适用不同的开发场合。
TreeSet
和
HashSet
所实现的功能也是完全一样的,区别在于
HashSet
在内存中是以
Hash
算法来进行计算和排列的,因此内存空间并不连续,而
TreeSet
在散列排序以后,会自动按照字母顺序进行升序排序,由于排序会消耗很多时间,因此
TreeSet
的效率远远慢于
HashSet
。
HashMap
和
TreeMap
类似于
TreeSet
和
HashSet
因此此处不再讲解。
为了帮助学员理解,我布置了一题企业开发过程中一直使用的集合框架的结合对象的开发题目,以此来帮助学员理解集合框架的意义,这个案例要求学员开发一个既具有顺序存储,又能
Key
-
Value
映射的集合实体,为了帮助学员完成这项任务我将该类的接口定义如下:
package
cn.softworks.common;
import
java.util.Iterator;
/**
*
*
<p>
集合综合工具类
</p>
*
*
<p>
该类可以实现ArrayList和HashMap的功能,
*
既可以实现顺序存储又可以Key
-
Value
映射
</p>
*
*
<p>
Copyright:
Copyright
(c)
2006
</p>
*
*
<p>
Company:
Softworks
</p>
*
*
@author
Chen.Yu
*
@version
1.0
*/
public
interface
IDataCollection {
/**
*
向当前集合增加对象
*
@param
key
添加到集合中数据的键值
*
@param
value
添加到集合中数据的数值
*/
public
void
add(Object key, Object value);
/**
*
向当前集合插入对象
*
@param
index
插入的位置
*
@param
key
添加到集合中数据的键值
*
@param
value
添加到集合中数据的数值
*/
public
void
add(
int
index, Object key, Object value);
/**
*
更新当前集合中的对象
*
@param
index
插入的位置
*
@param
key
添加到集合中数据的键值
*
@param
value
添加到集合中数据的数值
*/
public
void
set(
int
index,Object key, Object value);
/**
*
根据键值从当前集合中得到数据
*
@param
key
添加到集合中数据的键值
*
@return
添加到集合中数据的数值
*/
public
Object get(Object key);
/**
*
根据索引从当前集合中得到数据
*
@param
index
索引位置
*
@return
添加到集合中数据的数值
*/
public
Object get(
int
index);
/**
*
根据索引从当前集合中得到键值
*
@param
index
索引位置
*
@return
添加到集合中数据的键值
*/
public
Object getKey(
int
index);
/**
*
根据索引从当前集合中得到键值
*
@param
index
索引位置
*
@return
添加到集合中数据的键值
*/
public
boolean
hasKey(Object key);
/**
*
根据键值从当前集合中得到改键值的位置
*
@param
index
索引位置
*
@return
添加到集合中数据的键值
*/
public
int
getPosition(Object key);
/**
*
根据索引从当前集合中得到删除数据
*
@param
index
索引位置
*/
public
void
remove(
int
index);
/**
*
根据键值从当前集合中得到删除数据
*
@param
key
添加到集合中数据的键值
*/
public
void
remove(Object key);
/**
*
删除集合中所有的数据
*/
public
void
clear();
/**
*
得到集合中数据的个数
*
@return
集合中数据的个数
*/
public
int
size();
/**
*
得到集合中Value的循环器
*
@return
Value
的循环器
*/
public
Iterator getValues();
/**
*
得到集合中Key的循环器
*
@return
Key
的循环器
*/
public
Iterator getKeys();
}