惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

U
Unit 42
Google DeepMind News
Google DeepMind News
Stack Overflow Blog
Stack Overflow Blog
H
Help Net Security
MongoDB | Blog
MongoDB | Blog
I
InfoQ
N
Netflix TechBlog - Medium
T
Tailwind CSS Blog
量子位
博客园 - 叶小钗
月光博客
月光博客
IT之家
IT之家
G
Google Developers Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
小众软件
小众软件
S
SegmentFault 最新的问题
Engineering at Meta
Engineering at Meta
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
aimingoo的专栏
aimingoo的专栏
云风的 BLOG
云风的 BLOG
Vercel News
Vercel News
爱范儿
爱范儿
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
宝玉的分享
宝玉的分享

博客园 - csdnexpert

美国程序员Peter:落脚北京只因这里的胡同 不是冷饭的冷饭:重评芙蓉姐姐现象 从早晨8点到晚上12点:WebEx合肥CTO的一天 转胡一虎Blog:父亲是我生命中的永恒 十年后,ELM会不会创造SOA现在所创造的局面? 来京两载,今日入清华读书,记一笔 传媒人应该具备的素质:批判 理性 正气 异国也有欢乐:北京Linux User Group探访实录 解释传统与敏捷方法最贴切的故事:大象与猴子 媒体的关键还是在于“软件”(人与规范) “Web开发之华山论剑”制作花絮与推荐导读 利用Radrails开发Ruby on Rails程序入门指南 “悲欣交集”的《开源大本营》制作之路 Alistair讲座的几点感受:纠正对敏捷方法的误解 在Eclipse里实现Ant自动编译 Java之父Gosling:Java没有受到PHP、Ruby或C#的威胁 PC-cillin 2005网络安全版使用简评 为什么刘彻会成为一代名君? 有选择才精彩 到哪里都是从零开始 可怜的微软与项目管理经典图解 从对一篇文章的修改看写作中的主题把握 谁说做软件测试没有好的前途?反驳之 《程序员》第9期:面对多核时代 我们以何应对? 8月的最后一天,我们开赴日照前线 Java Transaction Design Strategies推荐阅读 温总理对读书和思考问题的回答 共享软件大鳄来华抢人 是机遇还是挑战? 只有资源共享 中国共享软件才能突破性发展 又可以写Blog了 心里竟有点小小的激动
集合框架的授课感想
csdnexpert · 2007-12-17 · via 博客园 - csdnexpert
 

       集合框架 (Collection) 可以说软件编程中过程中极其重要的一个概念,为什么我这里要用“极其”这个词呢?就是因为在我的14个项目研发经验中,几乎每个项目都需要使用集合框架,如果用好了集合框架,那么整个项目将会变得非常灵活,因此在我Softworks中心的培训经历中,我也非常注重对于这个概念的培训。其实比较喜欢在网上浏览技术的同学可能知道,网上有比较流行的32道经典Java面试考题,在这些考题中就有很多是用来考察学员对于集合框架的理解程度的。

       在授课的过程中,我借助了《人月神话》中的5W1H的学习分析方法对于集合框架进行了介绍:

       1What:什么是集合框架,集合框架其实就是一个“垃圾桶”,因为任意对象都可以放入集合框架中。由于数组存在比较明显的缺陷(例如:一次声明所产生的数据类型必须是一致的,数据地址必须是连续的,数组长度是定长的等等),而集合框架比数组更灵活更实用,甚至可以将集合框架中的某些部分理解为数组的包装类。

       2Why集合框架比数组来的更灵活,可以说集合框架完全弥补了数组的一些缺点,虽然操作效率没有数组那么高,但是却可以大大提高软件的开发效率,而且不同的集合框架类可以适用于不同的场合。

       3Where:我们在项目的任何一个角落中都可以使用集合框架,例如,现在我们有2个实体类:顾客类(Customer)和订单类(Order),根据现实情况我们可以明确,一个顾客拥有多张订单,而一个订单只能隶属于一个客户,这个时候由于客户包含了多张订单,那么顾客类就可以用集合框架来存放所有的订单对象了。

       4When:集合框架顾名思义就是某些相关数据的整合个体,那么当我们需要将一些相同特性的个体整合或者说绑定在一起的时候,就可以考虑使用集合框架了,因为集合框架可以保存和帮定这样一些数据。

       5Who所有的Java,.Net程序员都可以使用集合框架,因为现今的面向对象的高级编程语言都提供了集合框架的处理类。

       6How:在理解了集合框架的意义以后我们来看看如何来使用集合框架

       SUN为我们提供了功能强大的JDK(1.5)因此我们可以通过java.util包中看到几乎所有的集合框架类,在讲解具体的集合框架之前我们来看看一些常用的集合类之间的关联关系:

通过上图我们可以看到常用的集合框架的继承支线,黑色的空心三角箭头表示的是接口之间的继承关系,而红色的空心箭头表示的是类对于接口的实现,就我个人的教学经验而言,我比较喜欢的是对比教学法,通过不同的对比教学来阐述类,接口之间的关系和区别,现在叙述如下:

List接口和Set接口的区别在于,List接口可以顺序存放数据,并且数据是允许重复的,而Set接口正好与List接口相反,不能顺序存放数据,也不能存放相同数据。

Map接口和Set接口基本类似,最大的区别在于Map接口要求使用Key-Value映射关系来存放数据,Map要保证Key在集合中是唯一不能重复的。

ArrayListLinkedList所实现的功能完全一样,但是他们在数据结构上有比较明显的区别ArrayList的内部组成是动态数组,因此他的取值速度比较快,而LinkedList的内部组成是单链表,所以对于集合增,删,改的速度比较快。SUN之所以这么设计就是为了使集合框架能适用不同的开发场合。

TreeSetHashSet所实现的功能也是完全一样的,区别在于HashSet在内存中是以Hash算法来进行计算和排列的,因此内存空间并不连续,而TreeSet在散列排序以后,会自动按照字母顺序进行升序排序,由于排序会消耗很多时间,因此TreeSet的效率远远慢于HashSet

       HashMapTreeMap类似于TreeSetHashSet因此此处不再讲解。

       为了帮助学员理解,我布置了一题企业开发过程中一直使用的集合框架的结合对象的开发题目,以此来帮助学员理解集合框架的意义,这个案例要求学员开发一个既具有顺序存储,又能KeyValue映射的集合实体,为了帮助学员完成这项任务我将该类的接口定义如下:

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();

}

 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1700800