集合框架 (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包中看到几乎所有的集合框架类,在讲解具体的集合框架之前我们来看看一些常用的集合类之间的关联关系:
通过上图我们可以看到常用的集合框架的继承支线,黑色的空心三角箭头表示的是接口之间的继承关系,而红色的空心箭头表示的是类对于接口的实现,就我个人的教学经验而言,我比较喜欢的是对比教学法,通过不同的对比教学来阐述类,接口之间的关系和区别,现在叙述如下:
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
*@version1.0
*/
publicinterface IDataCollection {
/**
*向当前集合增加对象
*@paramkey 添加到集合中数据的键值
*@paramvalue添加到集合中数据的数值
*/
publicvoid add(Object key, Object value);
/**
*向当前集合插入对象
*@paramindex插入的位置
*@paramkey 添加到集合中数据的键值
*@paramvalue添加到集合中数据的数值
*/
publicvoid add(int index, Object key, Object value);
/**
*更新当前集合中的对象
*@paramindex插入的位置
*@paramkey 添加到集合中数据的键值
*@paramvalue添加到集合中数据的数值
*/
publicvoid set(int index,Object key, Object value);
/**
*根据键值从当前集合中得到数据
*@paramkey添加到集合中数据的键值
*@return 添加到集合中数据的数值
*/
public Object get(Object key);
/**
*根据索引从当前集合中得到数据
*@paramindex 索引位置
*@return 添加到集合中数据的数值
*/
public Object get(int index);
/**
*根据索引从当前集合中得到键值
*@paramindex 索引位置
*@return 添加到集合中数据的键值
*/
public Object getKey(int index);
/**
*根据索引从当前集合中得到键值
*@paramindex 索引位置
*@return 添加到集合中数据的键值
*/
publicboolean hasKey(Object key);
/**
*根据键值从当前集合中得到改键值的位置
*@paramindex 索引位置
*@return 添加到集合中数据的键值
*/
publicint getPosition(Object key);
/**
*根据索引从当前集合中得到删除数据
*@paramindex 索引位置
*/
publicvoid remove(int index);
/**
*根据键值从当前集合中得到删除数据
*@paramkey 添加到集合中数据的键值
*/
publicvoid remove(Object key);
/**
*删除集合中所有的数据
*/
publicvoid clear();
/**
*得到集合中数据的个数
*@return集合中数据的个数
*/
publicint size();
/**
*得到集合中Value的循环器
*@returnValue的循环器
*/
public Iterator getValues();
/**
*得到集合中Key的循环器
*@returnKey的循环器
*/
public Iterator getKeys();
}
上海Softworks软件人才培训中心
电话:021-53086530 53086531
地址:上海市北京东路668号科技京城东楼9楼E座
网址:www.softworks.cn
电话:021-53086530 53086531
地址:上海市北京东路668号科技京城东楼9楼E座
网址:www.softworks.cn
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1700800