高性能Java集合框架之 fastutil

openkk 13年前發布 | 43K 次閱讀 Java Java開發

fastutil擴展了 Java集合框架,通過提供特定類型的map、set、list和queue,以及小內存占用、快速訪問和插入;也提供大(64位)array、set 和 list,以及快速、實用的 二進制文件和文本文件的I/O類。它是自由軟件,依照Apache許可證2.0發布,需要Java 6或更高版本。

類實現其標準接口(例如, map 的 Map),可以插入現有代碼。此外,它們還提供未在標準類的附加??功能(如雙向迭代器) 。

除了 對象和基本類型,fastutil類提供支持引用(references),即使用相等運算符,而不是比較對象的equals()方法。

源代碼由C預處理器生成,從一組驅動文件開始。您可以在查看javadoc生成的文檔。尤其是概述說明中fastutil使用的設計選擇。

大數據結構
使用fastutil 6類的一組新類,使得它可以處理非常大的集合,特別是其規模超過2 31 。大數組是數組的數組,由一個神奇的靜態方如果是帶有64為索引的單位數組; big list 提供64位列表索引,hash big set 的 大小是只受限于核心內存量。常用的方法來自java.util.Arrays,類似的類已經擴展到大數組:可查看Javadoc關于 BigArrays和 IntBigArrays 的文檔,以獲得通用和特定類型的可用方法 。

http://fastutil.dsi.unimi.it/

雖然JCF(Java Collections Framework)在設計做的很好,但是從性能很功能上都有一定的局限性,所有出現很多的擴展JDK的集合框架出現,除了fastutil之外,主要的JDK集合框架的擴展還有以下這么多,他們都各自有各自的特點,各有所長:

  • Commons Collections
  • Google Collections Library
  • Commons Primitives
  • Trove
  • Joda Primitives
  • Javolution
  • </ul>

    由于fastutil提供了相當豐富的類,所以類庫很大,比如fastutil-6.4.3.jar就有14.5MB。但是他在性能上極佳!

    fastutil以存儲的元素類型來劃分package,每個package下都有豐富的Class。
    如:
       List、BigList、Map、SortedMap、Set、Stack、Iterator......

    • it.unimi.dsi.fastutil.booleans
    • it.unimi.dsi.fastutil.bytes
    • it.unimi.dsi.fastutil.chars
    • it.unimi.dsi.fastutil.doubles
    • it.unimi.dsi.fastutil.floats
    • it.unimi.dsi.fastutil.ints
    • it.unimi.dsi.fastutil.io
    • it.unimi.dsi.fastutil.longs
    • it.unimi.dsi.fastutil.objects
    • it.unimi.dsi.fastutil.shorts
    • </ul>

      1、Int相關

      //===========IntList
      IntList list = new IntArrayList();

      for(int i = 0; i < 1000; i++){ list.add(i); }

      //取值 int value = list.getInt(0); System.out.println(value);// 0

      //轉成數組 int[] values = list.toIntArray(); System.out.println(values.length);// 1000

      //遍歷 IntListIterator i = list.iterator(); while(i.hasNext()){ System.out.println(i.nextInt()); }

      //===========Int2BooleanMap Int2BooleanMap map = new Int2BooleanArrayMap();

      map.put(1, true); map.put(2, false);

      //取值 boolean value1 = map.get(1); boolean value2 = map.get(2);

      System.out.println(value1);// true System.out.println(value2);// false

      //===========IntBigList IntBigList biglist = new IntBigArrayBigList();

      biglist.add(0); biglist.add(1); biglist.add(2);

      long size = biglist.size64();

      //取值 for(long index = 0; index < size; index++) { System.out.println(biglist.getInt(index)); }

      //===========IntSortedSet IntSortedSet s = new IntLinkedOpenHashSet( new int[] { 4, 3, 2, 1 } ); //獲取第一個元素 System.out.println(s.firstInt()); // 4 //獲取最后一個元素 System.out.println(s.lastInt()); // 1 //判斷是否包含一個元素 System.out.println(s.contains(5)); // false</pre>

      2、Long相關

      Long2IntSortedMap m = new Long2IntAVLTreeMap();

      m.put( 1, 5 ); m.put( 2, 6 ); m.put( 3, 7 ); m.put( 1000000000L, 10 );

      System.out.println(m.get( 1 )); // 5

      //當查找不到的時候,默認返回0 System.out.println(m.get( 4 )); // 0

      //設置默認返回值 m.defaultReturnValue( -1 ); System.out.println(m.get( 4 )); // -1

      //遍歷Map LongBidirectionalIterator key1 = m.keySet().iterator(); long s = 0; while( key1.hasNext() ) { s += key1.nextLong(); } System.out.println(s); // 1000000006

      //獲取Key值小于4的子Map Long2IntSortedMap m1 = m.headMap( 4 ); LongBidirectionalIterator key2 = m1.keySet().iterator(); while( key2.hasNext() ) { System.out.println(key2.nextLong()); }</pre>轉自:rensanning.iteye.com/blog/1548162

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!