Commons Collections,又是一個重量級的東西,為Java標準的Collections API提供了相當好的補充。我不知道其他人,就我自己而言,讓我用java.util.Collection及其子類,加上java.util.Collections類提供的操作方法,處理一些簡單的資料結構問題還可以,稍微複雜一點的就覺得有點頭痛,很多細節的地方需要我插入這樣那樣的小邏輯,或者感覺它太死板,不夠靈活,再或者確實有點晦澀吧。再說了,如果我只是處理一般的資料結構問題,為什麼不自己用數組或者自訂的鏈表來做,再加上Jakarta Commons的Lang提供的ArrayUtils、StringUtils等,已經基本夠了,效能可以保證,那麼還要這個Collections API幹嘛。當然,說到這裡有些偏激了,Collections當然有它存在的道理,能夠把常用的資料結構歸納起來,以通用的方式去維護和訪問,這應該說是一種進步,但是用起來似乎不夠友好。這個時候我就會想,如果Java比現在做得更好用些,或者有一套第三方的API把我的這些需求抽象出來,實現了,該多好。Commons Collections就是這樣一套API。
我們先來瀏覽一下它的包結構。一共是12個:
org.apache.commons.collections – Commons Collections自訂的一組公用的介面和工具類
org.apache.commons.collections.bag – 實現Bag介面的一組類
org.apache.commons.collections.bidimap – 實現BidiMap系列介面的一組類
org.apache.commons.collections.buffer – 實現Buffer介面的一組類
org.apache.commons.collections.collection – 實現java.util.Collection介面的一組類
org.apache.commons.collections.comparators – 實現java.util.Comparator介面的一組類
org.apache.commons.collections.functors – Commons Collections自訂的一組功能類
org.apache.commons.collections.iterators – 實現java.util.Iterator介面的一組類
org.apache.commons.collections.keyvalue – 實現集合和鍵/值對應相關的一組類
org.apache.commons.collections.list – 實現java.util.List介面的一組類
org.apache.commons.collections.map – 實現Map系列介面的一組類
org.apache.commons.collections.set – 實現Set系列介面的一組類
過Java Collections API的朋友大概或多或少會同意我如下的劃分:在Java的Collections API中,不狹義的區分文法上的介面和類,把它們都看作是類的話,大致我們可以發現三種主要的類別:
1- 容器類:如Collection、List、Map等,用於存放對象和進行簡單操作的;
2- 操作類:如Collections、Arrays等,用於對容器類的執行個體進行相對複雜操作如排序等;
3- 輔助類:如Iterator、Comparator等,用於輔助操作類以及外部調用代碼實現對容器類的操作,所謂輔助,概括而通俗的來講,就是這些類提供一種演算法,你給它一個對象或者一組對象,或者僅僅是按一定的規則調用它,它給你一個運算後的答案,協助你正確處理容器物件。比如Iterator會告訴你容器中下一個對象有沒有、是什麼,而Comparator將對象大小/先後次序的演算法邏輯獨立出來。
同樣,Jakarta Commons Collections我們細細看來,也能夠找出類似的劃分:
1- 作為容器類的補充,我們可以找到Bag、Buffer、BidiMap、OrderedMap等等;
2- 作為操作類的補充,我們可以找到CollectionUtils、IteratorUtils、ListUtils、SetUtils等等;
3- 作為輔助類的補充,我們可以找到MapIterator、Closure、Predicate、Transformer等等;