具有FastUtil的精简Java集合
針對我最近在GNU Trove庫上發表的《 發現Java原始資源集合的處理 》一書 , TheAlchemist指出了fastutil優于trove的一些優點:“我更喜歡fastutil( http://fastutil.di.unimi.it/ ),因為它仍在積極開發中,具有更多功能,支持大尺寸(> 2 ^ 32),并且具有更好的文檔。” 阿提拉-米哈伊·巴拉茲已借調第二個“I @ TheAlchemist的建議為fastutil:此! 這是一個很棒的圖書館。” 在這篇文章中,我從以前看過trove的相同角度研究了fastutil 。
在fastutil主頁上,將fastutil描述為Java TM Collections Framework的擴展,它提供了“特定類型的映射,集合,列表和隊列,具有較小的內存占用以及快速的訪問和插入”,以及“大型(64位)數組,設置和列表,以及用于二進制和文本文件的快速,實用的I / O類。” fastutil的許可證是Apache License,版本2 ,而fastutil的當前版本需要Java 7或更高版本。 目前(截至撰寫本文時), Java 6和Java 5也可以下載“未維護”的fastutil版本。
通過與標準Java集合使用的API調用相同的API調用,可以將元素添加到FastUtil集合中,如下面的代碼清單所示,該代碼清單將在JDK ArrayList中插入元素與在FastUtil DoubleArrayList中插入元素進行比較。
使用JDK插入雙打和使用FastUtil DoubleArrayList插入雙打
/*** Demonstrate standard JDK {@code ArrayList<Double>}* with some JDK 8 functionality.*/ public void demonstrateJdkArrayListForDoubles() {final ArrayList<Double> doubles = new ArrayList<>();doubles.add(15.5);doubles.add(24.4);doubles.add(36.3);doubles.add(67.6);doubles.add(10.0);out.println("JDK ArrayList<Double>:");out.println("\tDoubles List: " + doubles); }/*** Demonstrate use of DoubleArrayList and show how* similar using it is to using {@code ArrayList<Double>}.*/ public void demonstrateFastUtilArrayListForDoubles() {// Demonstrate adding elements to DoubleArrayList is// exactly like adding elements to ArrayList<Double>.final DoubleArrayList doubles = new DoubleArrayList();doubles.add(15.5);doubles.add(24.4);doubles.add(36.3);doubles.add(67.6);doubles.add(10.0);out.println("FastUtil DoubleArrayList:"); // DoubleArrayList overrides toString()out.println("\tDoubles List: " + doubles); }當執行上述兩種方法時,寫入標準輸出的雙精度項列表看起來完全相同,即使用相同的方括號括住以逗號分隔的雙精度值。
FastUtil集合傾向于實現適當的JDK集合接口。 例如,剛剛演示的類DoubleArrayList實現了幾個接口,包括Collection <Double>和List <Double>。 事實證明, DoubleArrayList還實現了it.unimi.dsi.fastutil.doubles.DoubleStack和it.unimi.dsi.fastutil.Stack <Double> 。 下一個代碼清單中展示了使用此類作為堆棧的能力。
使用FastUtil的DoubleArrayList作為堆棧
/*** Demonstrate FastUtil's Double Stack.** FastUtil's DoubleStack allows access to its* contents via push, pop, and peek. It is declared* as a DoubleArrayList type here so that the size()* method is available without casting.*/ public void demonstrateFastUtilDoubleStack() {final DoubleArrayList stack = new DoubleArrayList();stack.push(15.5);stack.push(17.3);stack.push(16.6);stack.push(2.2);out.println("FastUtil Stack of Doubles");out.println("\tPeek: " + stack.peek(0) + "; After Size: " + stack.size());out.println("\tPop: " + stack.pop() + "; After Size: " + stack.size());out.println("\tPeek: " + stack.peek(0) + "; After Size: " + stack.size()); }正如我在Trove上的博客文章中所討論的那樣,Trove提供了一個gnu.trove.TCollections類,該類類似于java.util.Collections的 (子集)。 FastUtil提供了類似的功能,但是這種提供靜態方法以對FastUtil集合起作用的方法通過靜態方法被分為特定于類型的類型和特定于結構的類,而不是在具有靜態方法的單個類中。 下一個代碼清單演示將這些特定于類型和特定于結構的類之一與靜態方法IntSets結合使用, 并將其與FastUtil IntLinkedOpenHashSet結合使用。 顧名思義, IntSets類提供了“使用[int]特定的集可以做有用的事情的靜態方法和對象。”
將IntSet與IntLinkedOpenHashSet一起使用
/*** Demonstrate one of FastUtil's "equivalent"s of the* java.util.Collections class. FastUtil separates its* grouping of static methods into classes that are* specific to the data type of the collection and to* the data structure type of the collection.*/ public void demonstrateFastUtilCollectionsClass() {final IntLinkedOpenHashSet integers = new IntLinkedOpenHashSet();integers.add(5);integers.add(7);integers.add(3);integers.add(1);final IntSet unmodifiableIntegers = IntSets.unmodifiable(integers);out.println("Unmodifiable Integers:");out.println("\tClass: " + unmodifiableIntegers.getClass().getCanonicalName());try{unmodifiableIntegers.add(15);}catch (Exception ex){out.println("\tException caught: " + ex);} }FastUtil支持使用顯式迭代器和Java SE 5引入的for-each循環的標準Java迭代方法。 因為FastUtil集合實現java.lang.Iterable,所以FastUtil集合甚至使用.forEach支持JDK 8樣式 (假定代碼是在JDK 8上構建和運行的)。 這些將在下一個代碼清單中進行演示。
以標準Java樣式迭代FastUtil集合
/*** Demonstrate "traditional" Java iteration of a* FastUtil collection.*/ public void demonstrateIterationWithIterator() {final LongOpenHashSet longs = new LongOpenHashSet();longs.add(15);longs.add(6);longs.add(12);longs.add(13);longs.add(2);final LongIterator longIterator = longs.iterator();while (longIterator.hasNext()){final long longValue = longIterator.next();out.print(longValue + " ");} }/*** Demonstrate iteration of a FastUtil collection* using Java's enhanced for-each approach.*/ public void demonstrateIterationWithForEach() {final LongLinkedOpenHashSet longs = new LongLinkedOpenHashSet();longs.add(15);longs.add(6);longs.add(12);longs.add(13);longs.add(2);for (final long longValue : longs){out.println(longValue + " ");} }/*** Demonstrate iteration of a FastUtil collection* using JDK 8 .forEach approach.*/ public void demonstrateIterationWithJdk8ForEach() {final LongLinkedOpenHashSet longs = new LongLinkedOpenHashSet();longs.add(15);longs.add(6);longs.add(12);longs.add(13);longs.add(2);longs.forEach(longValue -> out.print(longValue + " ")); }與FastUtil相關的其他觀察
- 由于FastUtil集合實現標準的JDK 8集合接口,因此可以很容易地使用熟悉的Java習慣用法來獲取和使用這些API。
- FastUtil集合通常提供一個構造函數,該構造函數接受基礎數據類型的數組以及重寫的toArray()方法和特定于類型的方法(例如toDoubleArray() [用于雙向定位的集合])以數組形式提供其數據元素。原語。
- FastUtil集合通常提供顯式覆蓋的toString()實現,這些實現允許像JDK集合一樣輕松編寫各個數據元素,并且與Java數組(需要Arrays.toString()方法)不同。
- FastUtil的Java軟件包通常按原始類型進行組織,并且該原始類型的各種數據結構類型的特定實現都在同一軟件包中進行。 例如,程序包的名稱類似it.unimi.dsi.fastutil.doubles , it.unimi.dsi.fastutil.ints等。
- 因為每個FastUtil集合特定于特定的原始數據類型,所以每個集合都不需要通用參數,并且沒有與通用相關的問題(例如擦除)。 我還沒有看到FastUtil像Trove那樣利用特定于類型的方法來收集特定于類型的方法,這可能是因為FastUtil更緊密地實現了相應的Java集合接口。
- 學習使用FastUtil時, FastUtil的Javadoc API文檔可能是最佳的起點。 在FastUtil的基于Javadoc的API文檔中,類,接口,枚舉和包通常都記錄得很好。
結論
與Trove一樣,FastUtil是一個庫,可以用來更有效地(就內存和性能而言)與Java集合一起使用。 雖然Trove以前似乎是眾多選擇中最受歡迎的,但由于包括TheAlchemist所列舉的原因,FastUtil可能是當前最受歡迎的選擇 :“仍在積極開發中,具有更多功能,支持大尺寸(> 2 ^ 32 ),并具有更好的文檔。” 除Trove和FastUtil外, 類似的庫還包括Java的高性能基元集合 ( HPPC ), Koloboke , Goldman Sachs集合 , Mahout集合和Javolution 。
翻譯自: https://www.javacodegeeks.com/2016/01/leaner-java-collections-with-fastutil.html
總結
以上是生活随笔為你收集整理的具有FastUtil的精简Java集合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: apache shiro_Apache
- 下一篇: ddos攻击下载(ddos攻击中文版)