具有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

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

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

相关文章

android的json解析方式,Android解析JSON方式

JSON数据格式的定义&#xff1a;JSON的全称是&#xff1a;JavaScript Object Notation&#xff0c;是一种轻量级的数据交换格式。它构建于两种结构&#xff1a;1、"名称/值" 对的集合(a collection of name / value pairs)。不同的语言中&#xff0c;它被理解为对象(…

uniapp无法使用substr_关公战秦琼------Excel、SPSS Modler和R的使用对比(下)

5. 数据可视化Excel在Excel中对数据可视化除常用的图表外&#xff0c;还有样式、迷你图等直接和实际数据来共同展示效果。另外&#xff0c;还可以与切片器、PowerView等功能结合来动态可视化。Excel中图表的类型很多&#xff0c;如常见的散点图、折线图、柱形图、饼图等&#x…

第三次预作业20155231邵煜楠:虚拟机上的Linux学习

java第三次预作业——虚拟机初体验(学习记录) 学习在笔记本上安装Linux操作系统通过老师给予的官网链接&#xff0c;下载了VirtualBox-5.1.14-112924-win和Ubuntu-16.04-desktop-amd64.iso开始按照安装&#xff0c;尽管如此&#xff0c;还是遇到来了一些问题。 -在选择虚拟机的…

nginx_反向代理

nginx_反向代理 1 worker_processes 1;2 3 events {4 5 worker_connections 1024;6 7 }8 9 10 11 http { 12 13 include mime.types; 14 15 default_type application/octet-stream; 16 17 sendfile on; 18 19 keepalive_timeout …

miui11未升级android版本,MIUI 11稳定版正式推送,升级前你需要了解

原标题&#xff1a;MIUI 11稳定版正式推送&#xff0c;升级前你需要了解10月18日&#xff0c;MIUI官网正式宣布MIUI 11 正式推送&#xff0c;这是在小米MIX Alpha发布会之时同时推出的&#xff0c;在经过内测、公测后正式面向大众消费者推送。以下是一些您升级前需要了解的东西…

lumion自动保存_LUMION吊打MAX,轻松玩转规划渲染!

--文末获取&#xff1a;城市配景建筑模型包--大型场景渲染是LUMION渲染中难度最高的图纸首先&#xff0c;需要大量非常优质的配景包括&#xff1a;配景建筑、植物其次&#xff0c;对硬件要求也极高像这样的图纸渲染主体建筑周边需要布置大量的配景建筑没有个2080TI&#xff0c;…

在地图上 添加柱状_如何做出一份惊艳的PPT地图页?这2个字,你一定要知道!...

这篇文章&#xff0c;咱们就从一个读者私信给我的案例来说&#xff0c;就是这张PPT&#xff1a;他当时问我的问题是&#xff0c;怎么把这个表格优化的更美观&#xff1f;坦白讲&#xff0c;这是一个无解的问题&#xff0c;为什么这么说呢&#xff1f;咱们简单对这个图表分析&am…

akka与neety_Akka STM –与STM Ref和Agent一起打乒乓球

akka与neety乒乓是一个经典示例&#xff0c;其中2个玩家&#xff08;或线程&#xff09;访问共享资源–乒乓表并在彼此之间传递Ball&#xff08;状态变量&#xff09;。 使用任何共享资源&#xff0c;除非我们同步访问&#xff0c;否则线程可能会遇到潜在的死锁情况。 PingPong…

怎样调用另一个html中的元素,html – 使用DIV作为另一个元素的背景

这里我用2个div做了一个例子&#xff1a;> .content,包含前端所需的一切> .background – 包含文本,图像和背景中的所有其他内容要将一个div包装在另一个div上(制作叠加层),你必须将它们放入相同的元素中,在本例中它是#wrapper div.放置位置&#xff1a;包装的相对宽度/高…

3.1HTML5样式的使用

1.标签&#xff1a;<style>&#xff1a;样式定义<link>&#xff1a;资源引用 2.属性rel"stylesheet"&#xff1a;外部样式表type"text/css"&#xff1a;引入文档的类型margin-left&#xff1a;边距 3.三种样式表插入方法 外部样式表&#xff1…

cobbler的dhcp服务_Cobbler服务器安装部署

网络安装大家一定不陌生&#xff0c;一般通过Pxedhcpnfstftp类似配置即可实现&#xff0c;但安装过程中还需手动干预&#xff0c;后来加入了kickstart可全自动同时安装数百台系统&#xff0c;方便运维管理&#xff01;但kickstart存在可配置性差&#xff0c;会打断本网段其它电…

JIT编译器,内联和转义分析

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

多步注册页面html模板,PHP HTML多步骤页面_php_开发99编程知识库

我正在做一个项目&#xff0c;向数据库Mysql添加信息。 下面是我们使用会话创建 3表单并按步骤提供用户注册和用户&#xff0c;以及这里会话保存记录&#xff0c;如果我在步骤2 或者步骤 2中可以回滚和编辑某些内容。 这应该用会话完成。 如果我做了什么&#xff0c;我希望你帮…

云顶之弈机器人法爆_云顶之弈10.16b机器人阵容推荐 云顶之弈10.16b机器人娱乐阵容玩法攻略...

云顶之弈10.16b机器人阵容推荐&#xff0c;在云顶之弈10.16b版本中机器人没有什么改动&#xff0c;所以以机器人为核心的娱乐阵容依然可以玩&#xff0c;而且运气好的话吃鸡也不是不可以&#xff0c;下面小编为大家带来了云顶之弈10.16b机器人娱乐阵容玩法攻略&#xff0c;一起…

在running android lint期间发生了内部错误.,Eclipse出现quot;Running Android Lint has encountered a problemquot...

近期打开Eclipse的时候&#xff0c;总是发生这种一个错误&#xff1a;"Running Android Lint has encountered a problem"。截图例如以下&#xff1a;。可是Eclipse能够正常执行程序。不会造成其它影响。可是每次打开Eclipse时。总是看到这个警告&#xff0c;心情会非…

分页JQ+模糊查询

--页面 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <meta http-equiv"X-UA-Compatible" content"IEedge,chrome1"> <meta name"renderer" content"webkit|ie-stand"> <t…

idea 导出war包_使用IDEA实现远程代码DEBUG调试教程详解

我们在使用 IDEA DEBUG调试代码的时候&#xff0c;常常见到控制台会输出一句这样的话&#xff1a;「Connected to the target VM, address: 127.0.0.1:62981, transport: socket」&#xff0c;所以即使代码不在本地运行&#xff0c;只要JVM打开调试模式&#xff0c;并且网络能够…

lucene创建索引_Lucene概述第一部分:创建索引

lucene创建索引介绍 我最近一直在与开源搜索引擎Lucene合作 。 我不是专家&#xff0c;但是由于我只是浏览了一些相当稀疏的文档并将应用程序从Lucene的很旧的版本迁移到了最新版本的2.4&#xff0c;所以我在总体上很清楚。 Lucene的文档有点让人想像不到&#xff0c;因此我想趁…

鸿蒙os2.0发布回放,华为HarmonyOS 2.0系统发布会内容大全 鸿蒙os6月2日直播回放地址入口...

华为鸿蒙os6月2日直播回放在哪里看&#xff1f;华为HarmonyOS 2系统发布会说了些啥&#xff1f;HarmonyOS 2系统在6月2日正式发布了&#xff0c;之前预约过的小伙伴现在就可以更新体验了&#xff0c;这次发布将会对安卓系统一个重大的革新&#xff0c;将会彻底颠覆之前的安卓系…

02-SSH综合案例:需求分析(后台)

1.1.7 用户模块:(后台) 不用添加了&#xff0c;添加的话在前台就注册了。 查询所有用户&#xff1a; 修改用户信息&#xff1a; 删除用户信息&#xff1a; 1.1.8 一级分类:(后台) 主要都还是增删改查的操作 查询所有一级分类&#xff1a; *分页 添加一级分类&#xff1a; 修改…