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使用的设计选择。
[b]大数据结构[/b]
使用fastutil 6类的一组新类,使得它可以处理非常大的集合,特别是其规模超过2 31 。大数组是数组的数组,由一个神奇的静态方如果是带有64为索引的单位数组; big list 提供64位列表索引,hash big set 的 大小是只受限于核心内存量。常用的方法来自java.util.Arrays,类似的类已经扩展到大数组:可查看Javadoc关于 BigArrays和 IntBigArrays 的文档,以获得通用和特定类型的可用方法 。
[url=http://fastutil.dsi.unimi.it/]http://fastutil.dsi.unimi.it/[/url]
虽然JCF(Java Collections Framework)在设计做的很好,但是从性能很功能上都有一定的局限性,所有出现很多的扩展JDK的集合框架出现,除了fastutil之外,主要的JDK集合框架的扩展还有以下这么多,他们都各自有各自的特点,各有所长:
[list][*][url=http://commons.apache.org/collections/]Apache Commons Collections[/url]
[*][url=http://commons.apache.org/primitives/]Apache Commons Primitives [/url]
[*][url=http://code.google.com/p/guava-libraries]Google Guava[/url]
[*][url=http://trove.starlight-systems.com/]Trove[/url]
[*][url=http://code.google.com/p/vanilla-java/wiki/HugeCollections]Huge Collections[/url]
[*][url=http://joda-primitives.sourceforge.net/]Joda Primitives[/url]
[*][url=http://javolution.org/]Javolution[/url]
[*][url=https://github.com/goldmansachs/gs-collections]Goldman Sachs Collections[/url][/list]
这里有一篇关于HashMap的性能测试:[url=http://java-performance.info/large-hashmap-overview-jdk-fastutil-goldman-sachs-hppc-koloboke-trove/]Large HashMap overview: JDK, FastUtil, Goldman Sachs, HPPC, Koloboke, Trove[/url]
由于fastutil提供了相当丰富的类,所以类库很大,比如fastutil-6.4.3.jar就有14.5MB。但是他在性能上极佳!
fastutil以存储的元素类型来划分package,每个package下都有丰富的Class。
如:
List、BigList、Map、SortedMap、Set、Stack、Iterator......
[list]
[*] 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
[/list]
[b]1、Int相关[/b]
[b]2、Long相关[/b]
类实现其标准接口(例如, map 的 Map),可以插入现有代码。此外,它们还提供未在标准类的附加??功能(如双向迭代器) 。
除了 对象和基本类型,fastutil类提供支持引用(references),即使用相等运算符,而不是比较对象的equals()方法。
源代码由C预处理器生成,从一组驱动文件开始。您可以在查看javadoc生成的文档。尤其是概述说明中fastutil使用的设计选择。
[b]大数据结构[/b]
使用fastutil 6类的一组新类,使得它可以处理非常大的集合,特别是其规模超过2 31 。大数组是数组的数组,由一个神奇的静态方如果是带有64为索引的单位数组; big list 提供64位列表索引,hash big set 的 大小是只受限于核心内存量。常用的方法来自java.util.Arrays,类似的类已经扩展到大数组:可查看Javadoc关于 BigArrays和 IntBigArrays 的文档,以获得通用和特定类型的可用方法 。
[url=http://fastutil.dsi.unimi.it/]http://fastutil.dsi.unimi.it/[/url]
虽然JCF(Java Collections Framework)在设计做的很好,但是从性能很功能上都有一定的局限性,所有出现很多的扩展JDK的集合框架出现,除了fastutil之外,主要的JDK集合框架的扩展还有以下这么多,他们都各自有各自的特点,各有所长:
[list][*][url=http://commons.apache.org/collections/]Apache Commons Collections[/url]
[*][url=http://commons.apache.org/primitives/]Apache Commons Primitives [/url]
[*][url=http://code.google.com/p/guava-libraries]Google Guava[/url]
[*][url=http://trove.starlight-systems.com/]Trove[/url]
[*][url=http://code.google.com/p/vanilla-java/wiki/HugeCollections]Huge Collections[/url]
[*][url=http://joda-primitives.sourceforge.net/]Joda Primitives[/url]
[*][url=http://javolution.org/]Javolution[/url]
[*][url=https://github.com/goldmansachs/gs-collections]Goldman Sachs Collections[/url][/list]
这里有一篇关于HashMap的性能测试:[url=http://java-performance.info/large-hashmap-overview-jdk-fastutil-goldman-sachs-hppc-koloboke-trove/]Large HashMap overview: JDK, FastUtil, Goldman Sachs, HPPC, Koloboke, Trove[/url]
由于fastutil提供了相当丰富的类,所以类库很大,比如fastutil-6.4.3.jar就有14.5MB。但是他在性能上极佳!
fastutil以存储的元素类型来划分package,每个package下都有丰富的Class。
如:
List、BigList、Map、SortedMap、Set、Stack、Iterator......
[list]
[*] 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
[/list]
[b]1、Int相关[/b]
//===========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
[b]2、Long相关[/b]
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());
}