java集合性能_Java集合性能分析-疯狂Java讲义
一、各Set實(shí)現(xiàn)類的性能分析
HashSet和TreeSet是Set的兩個典型實(shí)現(xiàn)。HashSet的性能總是比TreeSet好(特別是最常用的添加、查詢元素等操作),因?yàn)門reeSet需要額外的紅黑樹算法來維護(hù)集合元素的次序。只有當(dāng)需要一個排序的Set時,才應(yīng)該使用TreeSet,否則都應(yīng)該使用HashSet。
HashSet的子類:LinkedHashSet,對于普通的插入、刪除操作,LinkedHashSet比HashSet要略微慢一點(diǎn),這是由維護(hù)鏈表所帶來的額外開銷造成的,但由于有了鏈表,遍歷LinkedHashSet會更快
EnumSet是所有Set實(shí)現(xiàn)類中性能最好的,但它只能保存同一個枚舉類的枚舉值作為集合元素
Set的三個實(shí)現(xiàn)類HashSet、TreeSet和EnumSet都是線程不安全的。如果有多個線程同時訪問一個Set集合,并且有超過一個線程修改了該Set集合,則必須手動保證該Set集合的同步性。通??梢酝ㄟ^Collections工具類的synchronizedSortedSet方法“包裝”該Set集合。這個操作最好在創(chuàng)建時進(jìn)行,以防止對Set集合的意外非同步訪問。
二、各種線性表的性能分析
Java提供的List就是一個線性表接口,而ArrayList、LinkedList又是線性表的兩種典型實(shí)現(xiàn):基于數(shù)組的線性表和基于鏈表的線性表。Queue代表了隊(duì)列,Deque代表了雙端隊(duì)列(既可作為隊(duì)列使用,也可作為棧使用)
一般來說,由于數(shù)組以一塊連續(xù)內(nèi)存區(qū)來保存所有的數(shù)組元素,所以數(shù)組在隨機(jī)訪問時性能最好,所有的內(nèi)部以數(shù)組作為底層實(shí)現(xiàn)的集合在隨機(jī)訪問時性能都比較好;而內(nèi)部以鏈表作為底層實(shí)現(xiàn)的集合在執(zhí)行插入、刪除操作時有較好的性能。但總體來說,ArrayList的性能比LinkedList的性能要好,因此大部分時候都應(yīng)該考慮使用ArrayList。
關(guān)于使用List集合有如下建議:
1. 如果需要遍歷List集合元素,對于ArrayList、Vector集合,應(yīng)該使用隨機(jī)訪問方法(get)來遍歷集合元素,這樣性能更好;對于LinkedList集合,則應(yīng)該采用迭代器(Iterator)來遍歷集合元素。
2. 如果需要經(jīng)常執(zhí)行插入、刪除操作來改變包含大量數(shù)據(jù)的List集合的大小,可考慮使用LinkedList集合。使用ArrayList、Vector集合可能需要經(jīng)常重新分配內(nèi)部數(shù)組的大小,效果可能較差。
3. 如果有多個線程需要同時訪問List集合中的元素,開發(fā)者可考慮使用Collections將集合包裝成線程安全的集合。
三、各Map實(shí)現(xiàn)類的性能分析
對于Map的常用實(shí)現(xiàn)類而言,雖然HashMap和Hashtable的實(shí)現(xiàn)機(jī)制幾乎一樣,但由于Hashtable是一個古老的、線程安全的集合,因此HashMap通常比Hashtable要快。
TreeMap通常比HashMap、Hashtable要慢(尤其在插入、刪除key-value對時更慢),因?yàn)榈讓硬捎眉t黑樹來管理key-value對(紅黑樹的每個節(jié)點(diǎn)就是一個key-value對)。
使用TreeMap有一個好處: TreeMap中的key-value對總是處于有序狀態(tài),無須專門進(jìn)行排序操作。當(dāng)TreeMap被填充之后,就可以調(diào)用keySet(),取得由key組成的Set,然后使用toArray()方法生成key數(shù)組,接下來使用Arrays的binarySearch()方法在已排序的數(shù)組中快速地查詢對象。
對于一般的應(yīng)用場景,程序應(yīng)該多考慮使用HashMap,因?yàn)镠ashMap正是為快速查詢設(shè)計的(HashMap底層其實(shí)也是采用數(shù)組來存儲key-value對)。但如果程序需要一個總是排好序的Map時,則可以考慮使用TreeMap。
LinkedHashMap比HashMap慢一點(diǎn),因?yàn)樗枰S護(hù)鏈表來保持Map中key-value時的添加順序。IdentityHashMap性能沒有特別出色之處,因?yàn)樗捎门cHashMap基本相似的實(shí)現(xiàn),只是它使用==而不是equals()方法來判斷元素相等。EnumMap的性能最好,但它只能使用同一個枚舉類的枚舉值作為key。
總結(jié)
以上是生活随笔為你收集整理的java集合性能_Java集合性能分析-疯狂Java讲义的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 词频_java程序:统计单词词
- 下一篇: java文件下载并添加水印_Java下载