marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog336280.html" frameborder="0" width="336" scrolling="no" height="280">
集合框架 (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;
/**
*
*
*該類可以實現ArrayList和HashMap的功能, * 既可以實現順序存儲又可以Key-Value映射
*
*Copyright:Copyright(c)2006 *
*
*@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();
}