幾種Java集合框架詳解_第1頁
幾種Java集合框架詳解_第2頁
幾種Java集合框架詳解_第3頁
幾種Java集合框架詳解_第4頁
幾種Java集合框架詳解_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

幾種Java集合框架詳解Java集合框架Koloboke詳解作者:chszs,未經博主允許不得轉載。經許可的轉載需注明作者和博客主頁:/chszsKoloboke的目標是替換標準的Java集合和流的API,提供更高效的實現(xiàn)。Koloboke目前的版本主要是替換java.util.HashSet和java.util.HashMap。Koloboke提供了一套完整的集合原始類型的實現(xiàn),可以避免開銷很大的裝箱/拆箱操作,節(jié)省了原始類型裝箱消耗的內存在Koloboke中,HashSet和HashMap比其它專門的實現(xiàn)(比如GScollections、fastutil、HTTP&Trove)要更快,這是因為:1)相比于其它庫,Koloboke對每個entry使用了更少的內存Koloboke目標是把鍵和值存儲在同一行高速緩存中所有的方法都經過了實現(xiàn)優(yōu)化,而不是像AbstractSet類或AbstractMap類那樣委托給框架類(SkeletonClass)Koloboke的官網:http://chronicle.software/products/koloboke-collections/Koloboke的特征:1)極好的兼容Java集合框架(JCF,JavaCollectionsFramework)2)所有原始專門的集合類都繼承了基本的接口(比如Collection、Set、Map)3)可用于替換標準的JCF4)KolobokeAPIforJava6andJava7向前兼容Java8的新方法5)快速失敗的語義6)支持null鍵(可選的),就像java.util.HashMap中的Float.NaN和Double.NaN鍵的處理那樣。什么時候使用ChronicleMap或KolobokeMap?使用ChronicleMap的場景:1) 存儲的entry超過5億條2) 在進程之間分布Map3)使用堆外內存(Off-HeapMemory),因為鍵和值占用了太多的內存,JVM遭遇GC的痛苦當不想在進程間共享數(shù)據(jù),且存儲的entry在5億條以內,那么Koloboke是更理想的選擇oKoloboke目前的最新版本為068版??梢詮腗aven倉庫使用它:<dependency><groupId>net.openhft</groupId><artifactId>koloboke-api-jdk8</artifactId><version>0.6.8</version></dependency><dependency><groupId>net.openhft</groupId><artifactId>koloboke-impl-jdk8</artifactId><version>0.6.8</version></dependency>Gradle依賴為dependencies{//'jdk8'insteadof'jdk6-7'ifyouuseJava8compile'net.openhft:koloboke-api-jdk6-7:0.6.8'runtime'net.openhft:koloboke-impl-jdk6-7:0.6.8'}也可以到這里下載:/OpenHFT/Koloboke/releasesJava集合框架GSCollections詳解作者:chszs,未經博主允許不得轉載。經許可的轉載需注明作者和博客主頁:/chszsGSCollections是一個開源的基于Java的集合框架,它兼容JDK的List、Set、Map實現(xiàn),并提供了一套功能豐富的API和工具類集合,其迭代循環(huán)的實現(xiàn)是受Smalltalk集合框架的啟發(fā)。GSCollections庫的模塊兼容Java5,包括gs-collections-api,gs-collections,gs-collections-testutils。GSCollections目前的最新版本為7.0.0版。主頁見:/goldmansachs/gs-collectionsGSCollections特性:1)改進了易讀性,減少了迭代循環(huán)代碼的重復2)實現(xiàn)了數(shù)個高級迭代模式(選擇select、拒絕reject、收集collect、注入inject)人性化的容器接口繼承了標準JDK的接口。)對于Collections、Arrays、Maps、Strings等提供了一致的迭代機制)對標準的ArrayList、HashSet和HashMap提供了經過優(yōu)化的高性能、低內存利用率的替代在工具類中執(zhí)行了更多幕后的優(yōu)化封裝了很多結構復雜的并行迭代和懶惰估算添加了新的容器,包括Bag、Interval、Multimap、BiMap,以及提供了很多容器類型的不可變(Immutable)版本從2005年開始發(fā)布,是一個成熟的庫GSCollections的使用:GSCollections把迭代豐富仿照容器類型中,并使用匿名的內部類來模擬Lambdas表達式。GSCollections的編程風格如下面代碼所示:MutableList<Person>people=FastList.newListWith(person1,person2,person3);MutableList<String>sortedLastNames=people.collect(Person.TO_LAST_NAME).sortThis();System.out.println("Commaseparated,sortedlastnames:"+sortedLastNames.makeString());Person.TO丄AST_NAME被定義為Person類的一個常量函數(shù)publicstaticfinalFunction<Person,String>TO_LAST_NAME=newFunction<Person,String>(){publicStringvalueOf(Personperson){returnperson.lastName;}};對于Java8,此函數(shù)可以使用Lambda表達式替代:MutableList<String>sortedLastNames=people.collect(person->person.getLastName()).sortThis();或者是用方法引用替代:MutableList<String>sortedLastNames=people.collect(Person::getLastName).sortThis();GSCollections的Maven依賴<dependency><groupId>com.goldmansachs</groupId><artifactId>gs-collections-api</artifactId><version>7.0.0</version></dependency><dependency><groupId>com.goldmansachs</groupId><artifactId>gs-collections</artifactId><version>7.0.0</version></dependency><dependency><groupId>com.goldmansachs</groupId><artifactId>gs-collections-testutils</artifactId><version>7.0.0</version><scope>test</scope></dependency><dependency><groupId>com.goldmansachs</groupId><artifactId>gs-collections-forkjoin</artifactId><version>7.0.0</version></dependency>Gradle依賴為dependencies{compile'com.goldmansachs:gs-collections-api:7.0.0'compile'com.goldmansachs:gs-collections:7.0.0'testCompile'com.goldmansachs:gs-collections-testutils:7.0.0'compile'com.goldmansachs:gs-collections-forkjoin:7.0.0'}另外幾種Java集合框架詳解作者:chszs,未經博主允許不得轉載。經許可的轉載需注明作者和博客主頁:/chszs1、fastutilfastutil是一個開源的Java集合框架的擴展它繼承了JavaCollectionFramework,提供了數(shù)種特定類型的容器,包括映射map、集合set、列表list、優(yōu)先級隊列(prorityqueue),實現(xiàn)了java.util包的標準接口(還提供了標準類所沒有的雙向迭代器),還提供了很大的(64位)的array、set、list,以及快速、實用的二進制或文本文件的I/O操作類。fastutil為專用的集合類提供了大容量的功能,而且類比普通Java集合類顯得更緊湊、速度更快。除了對象和原始類型,fastutil類還提供了對引用的支持,也即對象是可以使用等號操作符進行比較的,無需使用equals()方法。fastutil以Apache2.0許可證發(fā)布。使用它需要JDK7以上版本。fastutil以JAR包的方式提供,要注意這個JAR包文件比較大,因為它包含了大量的類文件。如果你只想要fastutil的一部分,那么應該考慮實用AutoJar之類的根據(jù)來自動提取所需的類。官網地址:http://fastutil.di.unimi.it/相似的技術:HPPC、Koloboke、GSCollections、TroveCollections、MahoutCollectionsfastutil目前的最新版本為7.0.10版這個最新的JAR包fastutil-7.0.10.jar大小為仃MB。其Maven依賴為:<dependency><groupId>it.unimi.dsi</groupId><artifactId>fastutil</artifactId><version>7.0.10</version></dependency>fastutil的在線API文檔見:http://fastutil.di.unimi.it/docs/fastutil6在大數(shù)據(jù)方面進行了增強,提供了一套新的類集合使得可以處理很大的集合,尤其是當集合數(shù)據(jù)超過2GB(2八31)時。比如HashBigSet僅僅受內存大小的限制。2、HPPC官網地址:/hppc.html官網地址:/carrotsearch/hppcHPPC即HighPerformancePrimitiveCollectionsforJava,對Java的原始集合類型如映射map、集合set、堆棧stack、列表list、隊列deque等進行了擴展,提供了更佳的內存利用率,帶來了更好的性能。HPPC當前的最新版本為0.7.13、Trove官網地址:/Trove庫提供了高速的Java集合類。GNUTrove庫有兩個目標:1)提供一個免費、高速、輕量級的java.util集合API的實現(xiàn)。這些實現(xiàn)被設計成可插撥的方式,以便替代標準JDK的集2)提供原始的集合,API風格保持一致。標準JDK使用包裝器類來封裝原始類型,比如java.lang.Integer,java.lang.Float等,那么標準集合類也使用了包裝后的類型。而對于Trove庫來說,集合直接存儲原始類型可以減少空間的使用量,并能帶來顯著的性能提升。GNUTrove庫既可以用于服務器端應用,也可以用于客戶端應用,它消耗的內存比標準集合框架更少。GNUTrove庫目前的最新版本為3.0.3版,很成熟的一個庫。應注意,Trove已經很久沒更新了,此項目可以不予考慮。4、MahoutCollections官網地址:/users/basics/mahout-collections.htmlMahoutCollections庫是一套容器類集合,它致力于解決標準Java集合框架的一些限制。MahoutCollections主要解決兩方面的問題:Java標準集合框架缺乏對原始類型的支持Java標準集合框架缺乏對openhashing的支持另外幾種Java集合框架詳解續(xù)作者:chszs,未經博主允許不得轉載。經許可的轉載需注明作者和博客主頁:/chszsfastutil庫優(yōu)于Trove庫的地方:Trove庫已經三年未更新了,屬于非活躍的開源項目;而fastutil一直在更新。fastutil有更豐富的特性,支持超大的集合(大于2八32,即4GB的集合),文檔也更豐富。fastutil是一個開源的Java集合框架的擴展,它繼承了JavaCollectionFramework,提供了數(shù)種特定類型的容器,包括映射map、集合set、列表list、優(yōu)先級隊列(prorityqueue),實現(xiàn)了java.util包的標準接口(還提供了標準類所沒有的雙向迭代器),還提供了很大的(64位)的array、set、list,以及快速、實用的二進制或文本文件的I/O操作類。fastutil為專用的集合類提供了大容量的功能,而且類比普通Java集合類顯得更緊湊、速度更快。除了對象和原始類型,fastutil類還提供了對引用的支持,也即對象是可以使用等號操作符進行比較的,無需使用equals()方法。fastutil以Apache2.0許可證發(fā)布。使用它需要JDK7以上版本。把元素添加到fastutil集合與添加到標準Java集合使用的API是相同的,下面的代碼示例展示了插入元素到標準JDK的ArrayList和插入元素到fastutil的DoubleArrayList。1、插入Double對象到JDK的ArrayList和插入Double對象到fastutil的DoubleArrayListimportjava.util.ArrayList;importit.unimi.dsi.fastutil.doubles.DoubleArrayList;publicclassDoubleArrayListTest{publicstaticvoidmain(String[]args){demoJdkArrayListForDoubles();demoFastutilArrayListForDoubles();}publicstaticvoiddemoJdkArrayListForDoubles(){finalArrayList<Double>doubles=newArrayList<>();doubles.add(98.5);doubles.add(24.7);doubles.add(52.8);doubles.add(1234.3);doubles.add(20.0);System.out.println("\tDoublesList:"+doubles);}publicstaticvoiddemoFastutilArrayListForDoubles(){finalDoubleArrayListdoubles=newDoubleArrayList();doubles.add(98.5);doubles.add(24.7);doubles.add(52.8);doubles.add(1234.3);doubles.add(20.0);System.out.println("\tFastutilDoubleArrayList:"+doubles);}輸出為:DoublesList:[98.5,24.7,52.8,1234.3,20.0]FastutilDoubleArrayList:[98.5,24.7,52.8,1234.3,20.0]從上面的代碼可以看岀,fastutil集合的實現(xiàn)與標準JDK集合的實現(xiàn)保持了一致。下面我們再看一個例子:2、使用fastutil的DoubleArrayList作為堆棧publicstaticvoiddemoFastutilDoubleStack(){finalDoubleArrayListstack=newDoubleArrayList();stack.push(19.9);stack.push(32.1);stack.push(11.8);stack.push(3.3);System.out.println("FastutilStackofDoubles");System.out.println("\tPeek:"+stack.peek(0)+";AfterSize:"+stack.size());System.out.println("\tPop:"+stack.pop()+";AfterSize:"+stack.size());System.out.println("\tPeek:"+stack.peek(0)+";AfterSize:"+stack.size());輸岀為:FastutilStackofDoublesPeek:3.3;AfterSize:4Pop:3.3;AfterSize:3Peek:11.8;AfterSize:3應注意DoubleArrayList的peek()方法和pop()方法均已被廢棄,DoubleArrayList繼承了AbstractDoubleList,抽象類AbstractDoubleList中廢棄了peek()方法和pop()方法,官方建議應直接使用具體的指定類型的類提供的方法,這里也就是add()方法和getDouble()方法。Trove庫提供了gnu.trove.TCollections類,它類似于java.util.Collections,可看作是一個子集。fastutil提供了相似的功能,但是它提供的是靜態(tài)方法,且被分到指定類型或指定結構的集合類中。比如IntSets類,與IntLinkedOpenHashSet結合使用,正如其名字,是指定了整型類型的集合類,提供了相應的靜態(tài)方法。3、IntSets與IntLinkedOpenHashSet結合使用publicstaticvoiddemofastutilCollectionsClass(){finalIntLinkedOpenHashSetintegers=newIntLinkedOpenHashSet();integers.add(43);integers.add(4);integers.add(8);integers.add(6);finalIntSetunmodifiableIntegers=IntSets.unmodifiable(integers);System.out.println("UnmodifiableIntegers:");System.out.println("\tClass:"+unmodifiableIntegers.getClass().getCanonicalName());try{unmodifiableIntegers.add(15);}catch(Exceptione){System.out.println("\tExceptioncaught:"+e);}}輸岀為:UnmodifiableIntegers:Class:s.IntSets.UnmodifiableSetExceptioncaught:java.lang.UnsupportedOperationExceptionfastutil支持標準Java迭代方法,使用明確定義的迭代器和Java5引入的for-each循環(huán)。fastutil集合還支持JDK8風格的.forEach()方法,因為fastutil集合實現(xiàn)了java.util.Iterable接口。下面用代碼進行說明:4、fastutil集合以標準Java風格進行迭代publicstaticvoiddemoIterationWithIterator(){finalLongOpenHashSetlongs=newLongOpenHashSet();longs.add(11);longs.add(23401203413l);longs.add(3);longs.add(32);longs.add(9);finalLongIteratorlongIterator=longs.iterator();

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論