具有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集合相关推荐
- java fastutil_具有FastUtil的精简Java集合
java fastutil 针对我最近在GNU Trove库上发表的< 发现Java原始资源集合的处理 >一书 , TheAlchemist指出了fastutil优于trove的一些优点: ...
- Java集合框架之fastutil
fastutil扩展了 Java集合框架,通过提供特定类型的map.set.list和queue,以及小内存占用.快速访问和插入:也提供大(64位)array.set 和 list,以及快速.实用的 ...
- Java 集合深入理解(17):HashMap 在 JDK 1.8 后新增的红黑树结构
点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 上篇文章我们介绍了 HashMap 的主要特点和关键方法源码解读,这篇文章我们介绍 HashMap 在 JDK1.8 新增 ...
- java 集合 接口_Java集合之Collection接口
1 - Java集合介绍 /* 1. 一方面, 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象 的操作,就要对对象进行存储. 2. 另一方面,使用Array存储对象方面具有一些弊 端,而 ...
- java 头尾 队列_超详细的java集合讲解
1 集合 1.1 为什么会出现集合框架 [1] 之前的数组作为容器时,不能自动拓容 [2] 数值在进行添加和删除操作时,需要开发者自己实现添加和删除. 1.2 Collection接口 1.2.1 C ...
- java集合总结_Java中集合总结
Java数组的长度是固定的,为了使程序能够方便地存储和操作数目不固定的一组数据,JDK类库提供了Java集合,这些集合类都位于java.util包中,但是与数组不同的是,集合中不能存放基本类型数据,而 ...
- 考考基础部分,谈谈Java集合中HashSet的原理及常用方法
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:工匠初心 cnblogs.com/LiaHon/p/1125 ...
- Java集合框架综述,这篇让你吃透!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:平凡希 cnblogs.com/xiaoxi/p/60899 ...
- 【Java集合框架】ArrayList类方法简明解析(举例说明)
本文目录 1.API与Java集合框架 2.ArrayList类方法解析 2.1 add() 2.2 addAll() 2.3 clear() 2.4 clone() 2.5 contains() 2 ...
最新文章
- 微信和支付宝支付模式详解及实现(.Net标准库)- OSS开源系列
- Fundebug前端JavaScript插件更新至1.6.0,新增test()方法用于测试
- uva5984(简单计算几何)
- 下一个十年需要的五大IT技能
- 理解浮动元素——怎么使用它们、它们有什么问题以及怎么解决这些问题。
- 图像灰度变换及图像数组操作
- 激活函数之 Sigmoid、tanh、ReLU、ReLU变形和Maxout
- python3.5 安装PyCrypto
- 10负3次方计算机语言,10的负3次方等于多少?
- 数据结构——图——拓扑排序算法
- pbootcms模板忘记后台密码怎么办?
- 文件夹中所有图片合成视频
- 【树莓派】更新树莓派SD卡测速一键脚本,SD卡读写速度测试
- ORACLE幻读(一)
- 540 万元!全球第一辆会飞的“自行车”:能飞 40 分钟,却不能上路?
- 手机号验证 199号码等
- 小马哥----高仿三星note3 n9002 9006主板型号A202 刷机后修复返回键失灵实例说明
- 方向导数与梯度(衡量空间向量变化趋势)
- 70.用Dnsmasq构建DNS服务器
- 吕鑫:VC++6.0就业培训宝典之MFC视频教程