|
|
有序否 |
允許元素重複否 |
|
Collection |
否 |
是 |
|
List |
是 |
是 |
|
Set |
AbstractSet |
否 |
否 |
|
HashSet |
|
TreeSet |
是(用二叉樹排序) |
|
Map |
AbstractMap |
否 |
使用key-value來映射和儲存資料,Key必須惟一,value可以重複 |
|
HashMap |
|
TreeMap |
是(用二叉樹排序)
|
4、詳細介紹
常用的類介紹
Collection:父介面;
Set:介面 ---實作類別: HashSet、LinkedHashSet
List:介面---實作類別: LinkedList,Vector,ArrayList
SortedSet:介面---實作類別:TreeSet
Map介面---實作類別:HashMap、Hashtable、LinkedHashMap、Properties
1、List:
List:有序列表,允許存放重複的元素;
實作類別:
ArrayList:數組實現,查詢快,增刪慢,線程不安全,輕量級;
LinkedList:鏈表實現,增刪快,查詢慢
Vector:數組實現,安全執行緒,重量級
例:
levit應用中使用集合分布表:
| 集合類型 |
應用數量
|
| ArrayList |
184處 |
| LinkedList |
2處
|
| Vector |
0 |
分析:
從以上的分析結果來看ArrayList是用的最多的,Vector沒有用到(有效能問題,不建議使用)。
下面分析一下應用LinkedList情境的代碼:
private List<Long> getGroupIds(List<GroupMemberDO> groupMemberDOs) { List<Long> groupIds = new LinkedList<Long>(); if (CollectionUtils.isEmpty(groupMemberDOs)) { return groupIds; } //背景工作調用該方法,此情境資料量很大,外面迴圈的集合類型是ArrayList(查詢快),對查詢出的資料儲存應用LinkedList(增加快)。 for (GroupMemberDO groupMemberDO : groupMemberDOs) { //此處只做增加操作,上面分析LinkedList是基於鏈表他做增加刪除很快。 groupIds.add(groupMemberDO.getGroupId()); } return DistinctElementFilter.filterList(groupIds); }
在實際開發根據業務情境選擇相應的集合類。
2.Set:
無序集合,不允許存放重複的元素;允許使用null元素
HashSet 的後台有一個HashMap;初始化後台容量;只不過產生一個HashSet的話,系統只提供key的訪問; 如果有兩個Key重複,那麼會覆蓋之前的;
實作類別 HashSet:equals返回true,hashCode返回相同的整數;雜湊表;儲存的資料是無序的。
實作類別LinkedHashSet:此實現與 HashSet 的不同之外在於,後者維護著一個運行於所有條目的雙重連結清單。儲存的資料是有序的。
雜湊表詳解:
http://www.bianceng.cn/Programming/sjjg/200705/1126.htm
例:
levit應用中使用集合分布表:
集合類型
|
應用數量
|
| HashSet |
3處 |
LinkedHashSet
|
0 |
分析:
從以上的分析結果來看沒有應用到LinkedHashSet,HashSet應用3處下面程式碼分析業務情境代碼:
Set<String> identities = new HashSet<String>();identities.add(VAccountIdentity.TP_ENTERPRISE);identities.add(VAccountIdentity.FREE_PENDING);identities.add(VAccountIdentity.TP_BUYER);以上代碼不允許元素重複。
不允許集合中有重複的資料可以選擇HashSet。
子介面SortedSet,對Set排序實作類別 :TreeSet:使用元素的自然順序對元素進行排序,或者根據建立 set 時提供的 Comparator 進行排序;二叉樹實現的;
二叉數的定義:
http://www.comp.nus.edu.sg/~xujia/mirror/algorithm.myrice.com/datastructure/basic/binary_tree/chapter1.htm
Levit應用目前沒有業務情境就用該集合。
3、Map
HashMap:索引值對,key不能重複,但是value可以重複;key的實現就是HashSet;value對應著放;允許null的鍵或值;
Hashtable:安全執行緒的,不允許null的鍵或值;
Properties::key和value都是String類型,用來讀設定檔;
TreeMap:對key排好序的Map; key 就是TreeSet, value對應每個key; key要實現Comparable介面或TreeMap有自己的構造器;
LinkedHashMap: 此實現與 HashMap 的不同之處在於,後者維護著一個運行於所有條目的雙重連結清單。儲存的資料是有序的。
levit應用中使用集合分布表:
集合類型
|
應用數量 |
| HashMap |
142處 |
| Hashtable |
0 |
| Properties |
0 |
| TreeMap |
0 |
| LinkedHashMap |
3 |
分析:
從以上的分析結果來看與List的分析結果大致相同,HashMap應用情境最多。
以下分析LinkedHashMap應用情境的代碼:
//此處要保證參數的順序,採用LinkedHashMap.Map<String, String> map = new LinkedHashMap<String, String>();// 判斷是從 "轉帳、繳存、轉出" 頁面到成功頁面的map.put(TransferConstants.SC_SUCCESS_U, transferType);map.put("id", b);actionResult.setRedirectURL(getRender(TransferConstants.REDIRECT_SUCCESS, map));
Webx架構中使用Properties讀取設定檔代碼:
/** * 裝載和初始化Webx中的services。<p>該類可以通過listener或servlet來調用。</p> */public class WebxLoader implements WebxController, WebxConstant { private void configureLog4j(BootstrapResourceLoaderService resourceLoader, Properties props) { //省略部分代碼................. // 如果設定檔名為*.xml,則使用DOMConfigurator,否則使用PropertyConfigurator。 String filename = log4jConfigurationURL.getFile(); if (filename.endsWith(LOG4J_CONFIGURATION_XML)) { DOMConfigurator.configure(log4jConfigurationURL, props); } else { props = new Properties(props); try { ////關鍵區段,讀取檔案到"props"集合中.--------------------------------------------------------------------------------------- props.load(log4jConfigurationURL.openStream()); PropertyConfigurator.configure(props); log.info("Configured log4j from " + log4jConfiguration); } catch (IOException e) { // 此時logging系統還不可用,記錄到servlet log中 logLog("Could not open Log4j configuration file " + log4jConfigurationURL.toExternalForm(), e); } } // 現在可以開始打log了。 resourceLoader.setLoggerReady(true); }}
4、兩個工具類 Arrays 和 Collections
1.
Arrays 、此類包含用來運算元組(比如排序和搜尋)的各種方法。
2.Collections、主要提供了在 collection 上進行操作的靜態方法(同步集合類方法) 。
Arrays應用執行個體代碼:
private void setGoodsList(ActionResult actionResult, GoodsDO[] goodsArray) { if (goodsArray != null) { //將數群組轉換成集合類 List<GoodsDO> goodsList = Arrays.asList(goodsArray); ///省略代碼...... actionResult.putInContext("goodsList", goodsList); actionResult.putInContext("gev", gev); } }