Java 集合類圖


 



有序否數組

容許元素重複否安全

Collection框架

ide

工具

List性能

spa

線程

Setcode

AbstractSetorm

HashSet

TreeSet

是(用二叉樹排序)

Map

AbstractMap

使用key-value來映射和存儲數據,Key必須唯一,value能夠重複

HashMap

TreeMap

是(用二叉樹排序)


 

四、詳細介紹

經常使用的類介紹

Collection:父接口; 
Set:接口 ---實現類: HashSet、LinkedHashSet
List:接口---實現類: LinkedList,Vector,ArrayList 
SortedSet:接口---實現類:TreeSet 

Map接口---實現類:HashMap、Hashtable、LinkedHashMap、Properties

一、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應用目前沒有業務場景就用該集合。

三、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);
    }
}

 
 四、兩個工具類 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);
        }
    }
相關文章
相關標籤/搜索