概述
FInt是一個用Java編寫的集合工具包,以下簡稱FI。因?yàn)镴ava自帶的集合包(java.util)不能直接操作基本數(shù)據(jù)類型,而必須使用基本類型的“包裝”類,這多少會影響程序性能或造成一些不便。FI實(shí)現(xiàn)了鍵或值是整數(shù)類型的集合工具包,但別的數(shù)據(jù)類型沒有實(shí)現(xiàn), 因?yàn)橐獙?shí)現(xiàn)所有數(shù)據(jù)類型的話,類的數(shù)目會很大,如果全靠手工編寫的話工作量也是很大的,而且也難維護(hù),因此如果以后真要實(shí)現(xiàn)的話,考慮使用類似于模板的方法。
下載方法
http://www.aygfsteel.com/Files/20070716/fint-1.1.zip
構(gòu)成簡介
FI主要提供了面向整數(shù)的集合、映射、列表的接口以及相應(yīng)的迭代器。
FI主要使用了三種方式實(shí)現(xiàn)了上面的接口:
- AVL樹,所有以AVL開頭的類。一般來說它的查找性能比紅黑樹略好,但對于要頻繁地插入刪除的情況,性能不如紅黑樹。
- 紅黑樹,所有以RB開頭的類。Java系統(tǒng)庫的中的TreeMap實(shí)現(xiàn)也是采用紅黑樹。
- 哈希表,所有以Hash開頭的類。由于采用了和Java系統(tǒng)庫中HashMap不同的沖突解決辦法,在沖突比較嚴(yán)重(裝載因子設(shè)得偏大)時仍有較好的性能,因此在沒有特殊情況時,推薦選用這些類。當(dāng)然,基于哈希表的類比其他的類要占用更多的空間,但可根據(jù)情況調(diào)節(jié)裝載因子來達(dá)到空間和時間的平衡。
- BitVector,它基本上算是一個系統(tǒng)庫中BitSet的替代品,但不同的是,它也實(shí)現(xiàn)了整數(shù)集合接口IntSet,由于受位組實(shí)現(xiàn)方式的限制,集合只能保存非負(fù)整數(shù)。其缺點(diǎn)很明顯,當(dāng)集合中有一個數(shù)值很大的元素時,將導(dǎo)致內(nèi)存的的極大浪費(fèi)。不過其也有無與倫比的優(yōu)點(diǎn),就是插入和搜索速度都極快,基本上要比其他實(shí)現(xiàn)方式快一個數(shù)量級以上,因此在元素的值都比較小且非負(fù)的情況下推薦使用。
- 整數(shù)列表,基本上就是系統(tǒng)庫中等價類的“整數(shù)版”而已。
訪問者模式:Visitor。
FI提供了多種訪問者接口,一般來說,在滿足需要的前提下,采用訪問者模式比迭代器模式更高效些。
性能
迄今為止,只拿FInt和系統(tǒng)庫中等價的類做過比較,從簡單的測試來看,集合和映射的插入、搜索操作都比系統(tǒng)庫快。另外因?yàn)镕I的哈希表采用紅黑樹來處理沖突,因此裝載能力比系統(tǒng)庫要強(qiáng)些(在裝載因子較大時仍有較好的性能)。
至于其他的支持基本數(shù)據(jù)類型的集合庫,如Trove等,還沒拿FI和它們做過比較。