另外几种Java集合框架详解续
2016-01-15 09:47
471 查看
另外几种Java集合框架详解续
作者:chszs,未经博主允许不得转载。经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszsfastutil库优于Trove库的地方:Trove库已经三年未更新了,属于非活跃的开源项目;而fastutil一直在更新。fastutil有更丰富的特性,支持超大的集合(大于2^32,即4GB的集合),文档也更丰富。
fastutil是一个开源的Java集合框架的扩展,它继承了Java Collection Framework,提供了数种特定类型的容器,包括映射map、集合set、列表list、优先级队列(prority queue),实现了java.util包的标准接口(还提供了标准类所没有的双向迭代器),还提供了很大的(64位)的array、set、list,以及快速、实用的二进制或文本文件的I/O操作类。
fastutil为专用的集合类提供了大容量的功能,而且类比普通Java集合类显得更紧凑、速度更快。除了对象和原始类型,fastutil类还提供了对引用的支持,也即对象是可以使用等号操作符进行比较的,无需使用equals()方法。
fastutil以Apache 2.0许可证发布。使用它需要JDK 7以上版本。
把元素添加到fastutil集合与添加到标准Java集合使用的API是相同的,下面的代码示例展示了插入元素到标准JDK的ArrayList和插入元素到fastutil的DoubleArrayList。
1、插入Double对象到JDK的ArrayList和插入Double对象到fastutil的DoubleArrayList
[code]import java.util.ArrayList; import it.unimi.dsi.fastutil.doubles.DoubleArrayList; public class DoubleArrayListTest { public static void main(String[] args) { demoJdkArrayListForDoubles(); demoFastutilArrayListForDoubles(); } public static void demoJdkArrayListForDoubles(){ final ArrayList<Double> doubles = new ArrayList<>(); doubles.add(98.5); doubles.add(24.7); doubles.add(52.8); doubles.add(1234.3); doubles.add(20.0); System.out.println("\tDoubles List: " + doubles); } public static void demoFastutilArrayListForDoubles(){ final DoubleArrayList doubles = new DoubleArrayList(); doubles.add(98.5); doubles.add(24.7); doubles.add(52.8); doubles.add(1234.3); doubles.add(20.0); System.out.println("\tFastutil DoubleArrayList: " + doubles); } }
输出为:
[code] Doubles List: [98.5, 24.7, 52.8, 1234.3, 20.0] Fastutil DoubleArrayList: [98.5, 24.7, 52.8, 1234.3, 20.0]
从上面的代码可以看出,fastutil集合的实现与标准JDK集合的实现保持了一致。下面我们再看一个例子:
2、使用fastutil的DoubleArrayList作为堆栈
[code] public static void demoFastutilDoubleStack(){ final DoubleArrayList stack = new DoubleArrayList(); stack.push(19.9); stack.push(32.1); stack.push(11.8); stack.push(3.3); System.out.println("Fastutil Stack of Doubles"); System.out.println("\tPeek: " + stack.peek(0) + "; After Size: " + stack.size()); System.out.println("\tPop: " + stack.pop() + "; After Size: " + stack.size()); System.out.println("\tPeek: " + stack.peek(0) + "; After Size: " + stack.size()); }
输出为:
[code]Fastutil Stack of Doubles Peek: 3.3; After Size: 4 Pop: 3.3; After Size: 3 Peek: 11.8; After Size: 3
应注意DoubleArrayList的peek()方法和pop()方法均已被废弃,DoubleArrayList继承了AbstractDoubleList,抽象类AbstractDoubleList中废弃了peek()方法和pop()方法,官方建议应直接使用具体的指定类型的类提供的方法,这里也就是add()方法和getDouble()方法。
Trove库提供了gnu.trove.TCollections类,它类似于java.util.Collections,可看作是一个子集。fastutil提供了相似的功能,但是它提供的是静态方法,且被分到指定类型或指定结构的集合类中。
比如IntSets类,与IntLinkedOpenHashSet结合使用,正如其名字,是指定了整型类型的集合类,提供了相应的静态方法。
3、IntSets与IntLinkedOpenHashSet结合使用
[code] public static void demofastutilCollectionsClass(){ final IntLinkedOpenHashSet integers = new IntLinkedOpenHashSet(); integers.add(43); integers.add(4); integers.add(8); integers.add(6); final IntSet unmodifiableIntegers = IntSets.unmodifiable(integers); System.out.println("Unmodifiable Integers: "); System.out.println("\tClass: " + unmodifiableIntegers.getClass().getCanonicalName()); try{ unmodifiableIntegers.add(15); }catch(Exception e){ System.out.println("\tException caught: " + e); } }
输出为:
[code]Unmodifiable Integers: Class: it.unimi.dsi.fastutil.ints.IntSets.UnmodifiableSet Exception caught: java.lang.UnsupportedOperationException
fastutil支持标准Java迭代方法,使用明确定义的迭代器和Java 5引入的for-each循环。fastutil集合还支持JDK 8风格的.forEach()方法,因为fastutil集合实现了java.util.Iterable接口。下面用代码进行说明:
4、fastutil集合以标准Java风格进行迭代
[code]public static void demoIterationWithIterator(){ final LongOpenHashSet longs = new LongOpenHashSet(); longs.add(11); longs.add(23401203413l); longs.add(3); longs.add(32); longs.add(9); final LongIterator longIterator = longs.iterator(); while(longIterator.hasNext()){ final long longValue = longIterator.next(); System.out.print(longValue + "\t"); } }
输出为:
[code]9 32 11 3 23401203413
.
[code]public static void demoIteratorWithForEach(){ final LongLinkedOpenHashSet longs = new LongLinkedOpenHashSet(); longs.add(11); longs.add(23401203413l); longs.add(3); longs.add(32); longs.add(9); for(final long longValue : longs){ System.out.print(longValue + "\t"); } }
输出为:
[code]11 23401203413 3 32 9
.
[code]public static void demoIteratorWithJdk8ForEach(){ final LongLinkedOpenHashSet longs = new LongLinkedOpenHashSet(); longs.add(11); longs.add(23401203413l); longs.add(3); longs.add(32); longs.add(9); longs.forEach(longValue -> System.out.print(longValue + "\t")); }
输出为:
[code]11 23401203413 3 32 9
fastutil相关的其它情况
1)fastutil集合实现了标准JDK8集合的接口,故其API易于使用。2)fastutil集合通常都提供了一个带参数(以基本数据类型的array为参数)的构造器,并重写了toArray()方法,以及提供了一个指定类型的方法(比如toDoubleArray()面向Double集合)。
3)fastutil集合通常提供了明确重写toString()的实现,易于让每一个数据元素输出,这与Java标准的Arrays.toString()不同。
4)fastutil的包是根据原始类型与不同数据结构的实现来进行组织的,且都在同一个包中。
5)由于每一个fastutil集合都是跟特定的原始数据类型相关,故每一个集合都不需要泛型参数,也就不存在泛型相关的问题。
6)fastutil的API文档是学习使用fastutil的最佳文档。
相关文章推荐
- java简单的文件复制
- Eclipse创建java web工程配置Tomacat和JDK 【转】
- JDK8新特性-Lambda
- Java Web学习总结(3)——Servlet详解
- Java Web学习总结(2)——Servlet入门
- 23种java设计模式例子汇总
- SpringMVC中用@ParamVariable传递的参数包含斜杠(/)时,匹配不了报404错误的解决方案
- Eclipse常用快捷键
- Java Web学习总结(1)——JavaWeb开发入门
- Java Web学习总结(1)——JavaWeb开发入门
- Java Web学习总结(1)——JavaWeb开发入门
- Java Web+Mysql Get请求中文乱码的解决
- Java异常处理和设计
- Java SE 学习 第一节
- Java设计模式—单例设计模式(Singleton Pattern)完全解析
- Apriori算法的JAVA实现
- Spring中Bean的命名问题(id和name区别)及ref和idref之间的区别
- Java遍历Map数据的几种方式
- 使用myeclipse为java web项目添加Spring框架
- 漫谈并发编程(六):java中一些经常使用的并发构件的介绍