java fastutil_具有FastUtil的精简Java集合

java fastutil

针对我最近在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似乎曾经是众多选择中最受欢迎的,而FastUtil也许是目前最受欢迎的,原因包括TheAlchemist引用的那些理由:“仍在积极开发中,具有更多功能,支持大尺寸(> 2 ^ 32 ),并具有更好的文档。” 除了Trove和FastUtil之外, 类似的库还包括Java的高性能基元集合 ( HPPC ), Koloboke , Goldman Sachs集合 , Mahout集合和Javolution 。

翻译自: https://www.javacodegeeks.com/2016/01/leaner-java-collections-with-fastutil.html

java fastutil

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336744.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 圆角按钮渐变,Android实现圆形渐变加载进度条

最近设计要求要一个圆形进度条渐变的需求&#xff1a;1.画圆形进度条2.解决渐变最终实现效果代码package com.view;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.grap…

javaone_JavaOne 2015:为JDK 9做准备– blog @ CodeFX

javaoneJavaOne 2015看到了Project Jigsaw团队关于Java 9中的模块化的一系列讨论 。它们都是非常有趣的&#xff0c;并且充满了宝贵的信息&#xff0c;我敦促每个Java开发人员都注意它们。 除此之外&#xff0c;我想给社区一种搜索和引用它们的方法&#xff0c;因此我在这里总…

android wifi 通讯录,通过wifi和gmail从symbian手机中将名片夹(通讯录)导入到android手机 | 古意人...

使用背景与条件&#xff1a;最近入手了android手机defy&#xff0c;机器到手后兴奋过度&#xff0c;马上将原symbian手机诺基亚E50的sim卡和内存卡都转移到了defy上&#xff0c;捣鼓了一段时间的defy&#xff0c;突然想起要同步原诺基亚手机的名片夹到defy中(android中貌似称为…

oracle aq_通过Java 8流使用Oracle AQ

oracle aqOracle数据库最令人敬畏的功能之一是Oracle AQ&#xff1a;Oracle数据库高级队列 。 AQ API直接在数据库中实现了完整的事务性消息传递系统。 在数据库处于系统中心的经典体系结构中&#xff0c;使用AQ进行进程间通信时&#xff0c;多个应用程序&#xff08;其中一些…

c语言建立多个有名管道,命名管道一个非常经典的题目

#include /*特别注意写管道时&#xff0c;设置打开管道文件的格式必须为可写*/#define FIFO_SERVER "myfifo"#define OPENMODE (O_WRONLY | O_NONBLOCK)int main(int argc, char **argv){int fd;int nwrite;/*打开管道文件&#xff0c;可写非阻塞*/if ((fd open(FIF…

jit 方法内联_JIT编译器,内联和转义分析

jit 方法内联即时&#xff08;JIT&#xff09; 即时&#xff08;JIT&#xff09;编译器是Java虚拟机的大脑。 JVM中对JIT编译器的影响最大。 一会儿&#xff0c;让我们退后一步&#xff0c;看看已编译和未编译语言的示例。 诸如Go&#xff0c;C和C 之类的语言之所以称为编译语…

nodejs android 推送,利用Nodejs怎么实现一个微信小程序消息推送功能

利用Nodejs怎么实现一个微信小程序消息推送功能发布时间&#xff1a;2021-01-20 13:55:29来源&#xff1a;亿速云阅读&#xff1a;92作者&#xff1a;Leah今天就跟大家聊聊有关利用Nodejs怎么实现一个微信小程序消息推送功能&#xff0c;可能很多人都不太了解&#xff0c;为了让…

kafka spark_您在2016年会做什么? Apache Spark,Kafka,Drill等

kafka spark让我们玩得开心。 这是新的一年的开始-我们正处于新事物的门槛上-因此让我们期待您在2016年可能会做的事情。现在我知道做出预测的风险&#xff0c;尤其是有记录的预测&#xff0c;但是我很高兴您能在一年后回访&#xff0c;看看我对2016年的预测是如何完成的。 您…

android ini文件格式,ini是什么格式的文件?ini文件怎么操作?

类型&#xff1a;Android平台大小&#xff1a;622KB语言&#xff1a;中文 评分&#xff1a;5.0标签&#xff1a;立即下载ini文件主要存放用户所做的选择以及系统的各种参数。用户可以通过修改INI文件,来改变应用程序和系统的很多配置。自定义一个文件&#xff0c;会成一个deskt…

android开发 apk文件,android开发中,将数据库文件与APK一起发布?

2015-11-11 回答可以将xx.db文件复制到eclipse android工程中的res\raw目录中。所有在res\raw目录中的文件不会被压缩&#xff0c;这样可以直接提取该目录中的文件。使用opendatabase方法来打开数据库文件&#xff0c;如果该文件不存在&#xff0c;系统会自动创建/sdcard/dicti…

jpa 关联实体的关联实体_JPA实体锁定模式的差异

jpa 关联实体的关联实体JPA本质上提供了两种锁定机制&#xff0c;以帮助同步对实体的访问。 两种机制都可以防止以下情况&#xff1a;两个事务在不知道的情况下相互覆盖数据。 通过实体锁定&#xff0c;我们通常希望通过2个并行事务来防止以下情况&#xff1a; 亚当的事务读取…

华为p6电信版 android 4.5,华为P6电信版系统应用apk补全教程 完整EMUI

现在要说的是华为P6电信版的系统应用apk补全教程&#xff0c;给你一个非阉割版的完整EMUI系统。大家应该都知道&#xff0c;电信定制版由于华为系统服务与电信的定制APP功能重叠&#xff0c;语音助手、云同步、云端备份、手机找回等系统应用apk全被“阉割”掉了&#xff0c;这几…

黑马ee在职进阶视频_进阶– Java EE 7前端5强

黑马ee在职进阶视频系列继续。 在初步概述和Arjan关于最重要的后端功能的文章之后 &#xff0c;我现在非常高兴让Ed Burns&#xff08; edburns &#xff09;使用他最喜欢的Java EE 7前端功能完成本系列。 感谢Markus Eisele让我有机会在他非常受欢迎的博客上发表帖子。 我和M…

如何构建股票ChatGPT查询全球股票市场以及常用Prompt

Blog&#xff1a;4 ways to use ChatGPT Stock Chatbot for stock analysis of Global Stock Markets NASDAQ NYSE LSE HKEX TSE NSE HANGHAI SHENZHEN 地址&#xff1a;http://deepnlp.org/blog/chatgpt-stock-global-market 全球股票市场&#xff1a;NASDAQ 纳斯达克, NYSE…

web.xml.jsf_看一下即将发布的JSF 2.3 Push支持

web.xml.jsf如前几篇文章所述&#xff0c;下一版本的JavaServer Faces&#xff08;Mojarra&#xff09;已添加了许多增强功能。 JSF 2.3计划于2017年与Java EE 8一起发布&#xff0c;但是您现在可以通过从源代码构建或运行里程碑版本来获得JSF的一些增强功能和更新以用于测试目…

android视频教程那个讲的最好,最全的android视频教程推荐 android视频教程怎么学习效果好...

很多同学对android学习很感兴趣&#xff0c;都对此有这样的疑问&#xff1a;“最全的android视频教程推荐&#xff0c;android视频教程怎么学习效果好?”那这里android培训专家就给我们来具体讲解下。Android开发学习主要是学习Android平台下开发的基础知识以及项目编程的实用…

android size_t在哪个头文件,size_t

size_t 类型定义在cstddef头文件中&#xff0c;该文件是C标准库的头文件stddef.h的C版。它是一个与机器相关的unsigned类型&#xff0c;其大小足以保证存储内存中对象的大小。例如&#xff1a;bitset的size操作返回bitset对象中二进制位中1的个数&#xff0c;返回值类型是size_…

jqgrid mvc_将JQGrid与Spring MVC和Gson集成

jqgrid mvc我在一个单页面应用程序上工作&#xff0c;我想在使用Spring MVC的应用程序的一部分中使用网格功能。 自从我上次使用JQGrid以来已经有一段时间了&#xff0c;找到让我起床所需的信息有点困难。 在这篇文章中&#xff0c;我想整理所有信息并将其放入教程中&#xff0…

javadocs_不会吸引人的JavaDocs源样本

javadocsJavaDoc源代码嵌入很烂&#xff01; 我喜欢JavaDoc&#xff0c;但年龄不理想。 当您使用其他工具&#xff08;例如&#xff0c;在Microsoft世界中&#xff09;时&#xff0c;嵌入式示例突然变得惊人&#xff0c;并且内置了“搜索”功能&#xff01; 我们为什么不能拥…

html语义化有哪些优点,语义化的HTML结构到底有什么好处?

相信大家都知道html和css&#xff0c;知道html结构和css表现分离&#xff0c;知道html语义化&#xff0c;这些都是这几年的热门关键字。语义化的html在国内也是一两年前才开始被追捧的&#xff0c;看看现在群里谈论的html结构&#xff0c;关于html结构的面试题&#xff0c;语义…