原文:http://www.cnblogs.com/xwdreamer/archive/2012/05/30/2526822.html1
http://blog.csdn.net/liulin_good/article/details/6213815
一、java集合類圖
上述類圖中,實線邊框的是實現類,比如ArrayList,LinkedList,HashMap等,短線邊框的是抽象類,比如AbstractCollection,AbstractList,AbstractMap等,而點線邊框的是接口,比如Collection,Iterator,List等。
發現一個特點,上述所有的集合類,都實現了Iterator接口,這是一個用於遍歷集合中元素的接口,主要包含hashNext(),next(),remove()三種方法。它的一個子接口LinkedIterator在它的基礎上又添加了三種方法,分別是add(),previous(),hasPrevious()。也就是說如果是先Iterator接口,那麼在遍歷集合中元素的時候,只能往後遍歷,被遍歷後的元素不會在遍歷到,通常無序集合實現的都是這個接口,比如HashSet,HashMap;而那些元素有序的集合,實現的一般都是LinkedIterator接口,實現這個接口的集合可以雙向遍歷,既可以通過next()訪問下一個元素,又可以通過previous()訪問前一個元素,比如ArrayList。
還有一個特點就是抽象類的使用。如果要自己實現一個集合類,去實現那些抽象的接口會非常麻煩,工作量很大。這個時候就可以使用抽象類,這些抽象類中給我們提供了許多現成的實現,我們只需要根據自己的需求重寫一些方法或者添加一些方法就可以實現自己需要的集合類,工作流昂大大降低。
二、詳解
常用的類介紹
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 進行排序;二叉樹實現的;
二叉數的定義:
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);
}
}
2.1HashSet
HashSet是Set接口的一個子類,主要的特點是:裏面不能存放重複元素,而且採用散列的存儲方法,所以沒有順序。這裏所說的沒有順序是指:元素插入的順序與輸出的順序不一致。
2.2ArrayList
ArrayList是List的子類,它和HashSet相反,允許存放重複元素,因此有序。集合中元素被訪問的順序取決於集合的類型。如果對ArrayList進行訪問,迭代器將從索引0開始,每迭代一次,索引值加1。然而,如果訪問HashSet中的元素,每個元素將會按照某種隨機的次序出現。雖然可以確定在迭代過程中能夠遍歷到集合中的所有元素,但卻無法預知元素被訪問的次序。
2.3LinkedList
LinkedList是一種可以在任何位置進行高效地插入和刪除操作的有序序列。
2.4HashMap
參考之前的一篇博客:Hashmap實現原理
三、比較