运动基元_发现大量Java基元集合处理

运动基元

在阅读博客文章5减少Java垃圾收集开销的技巧时 ,我想起了一个名为Trove的小型Java收集库,该库“为Java提供了高速的常规和原始收集”。 我对将Trove应用到允许原语的集合而不是要求集合中的元素成为完整的引用对象的能力特别感兴趣。 我在这篇文章中会更详细地介绍Trove 。

JDK的标准集合尊重泛型,并要求对象引用为其元素,并且不允许在集合中存储基元。 甚至看起来是将原语放入标准JDK集合中的代码也实际上是通过自动装箱将对象引用放入集合中的。 这种泛型方法的优点是能够使许多不同类型的对象使用相同的类和方法。 代价是即使可以存储更精简的基元,也需要存储完整的参考对象。

Trove库具有LPGL许可证 ,并且相对较小(不足10 MB),如“下载”页面的下一个屏幕快照所示:

troveDownloads-20151219

小型下载文件不仅包含JAR格式的必需库。 它还包含文档和源。 库JAR本身(本例中trove-3.1a1.jar )的大小约为2.5 MB。

troveJarSize

Trove易于使用的原因之一是,它在其自己的集合的API中很大程度上模仿了JDK集合的接口。 下一个代码清单演示了如何将值添加到List实现本质上是相同的API调用,无论使用JDK 7 List (在这种情况下为ArrayList)还是Trove提供的TDoubleArrayList 。

向JDK的ArrayList和Trove的TDoubleArrayList添加元素

/*** 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);out.println("\tMaximum double: " + doubles.stream().max(Double::compare));out.println("\tMinimum double: " + doubles.stream().min(Double::compare));out.println("\tSum of doubles: " + doubles.stream().mapToDouble(Double::doubleValue).sum());
}/*** Demonstrate use of TDoubleArrayList and show how* similar using it is to using {@code ArrayList<Double>}.*/
public void demonstrateTroveArrayListForDoubles()
{// Demonstrate adding elements to TDoubleArrayList is// exactly like adding elements to ArrayList<Double>.final TDoubleArrayList doubles = new TDoubleArrayList();doubles.add(15.5);doubles.add(24.4);doubles.add(36.3);doubles.add(67.6);doubles.add(10.0);out.println("Trove TDoubleArrayList:");  // TDoubleArrayList overrides toString()out.println("\tDoubles List: " + doubles);out.println("\tMaximum double: " + doubles.max());out.println("\tMinimum double: " + doubles.min());out.println("\tSum of doubles: " + doubles.sum());
}

上面的代码清单还演示了使用数组列表的Trove实现访问双精度集合的最大值,最小值和总和是多么容易。 将这些集合写入特定原始数据类型(在这种情况下为double)的优点之一是,可以在实现中提供专门应用于该数据类型的方法。 尽管对于String的集合或任意对象的集合返回最大值,最小值和总和可能没有多大意义,但是对于专门用于双精度的集合(例如TDoubleArrayList ,这些方法的含义显而易见。 上面的清单确实指示了如何使用流使用JDK 8实现相同的功能。

当查看上面的代码时,一个可能不明显的细微差别(由于自动装箱)是,JDK实现ArrayList存储引用Double对象,而Trove TDoubleArrayList实现存储原始double 。 Trove提供了各种数字类型的列表,集合和映射的实现,例如字节,字符,short,整数,long,float和double。

Trove提供的有趣的数据结构/集合之一是TDoubleArrayStack 。 在刚刚演示过的TDoubleArrayList的支持下, TDoubleArrayStack并未在其API中公开用于添加元素的add方法。 相反,其方法反映了后进先出(LIFO)堆栈实现中可能期望的语义: push(double)添加, pop()访问和删除最近添加的条目,以及peek()查看最近添加的条目而不将其删除。 下一个代码清单显示了此堆栈实现的应用程序。 还有其他数字数据类型的堆栈实现。

Trove的TDoubleArrayStack

/*** Demonstrate Trove's Double Array Stack.** Trove's TDoubleArrayStack allows access to its* contents via push, pop, and peek.*/
public void demonstrateTroveDoubleArrayStack()
{final TDoubleArrayStack stack = new TDoubleArrayStack();stack.push(15.5);stack.push(17.3);stack.push(16.6);stack.push(2.2);out.println("Trove Array Stack of Doubles");out.println("\tPeek: " + stack.peek() + "; After Size: " + stack.size());out.println("\tPop:  " + stack.pop() + "; After Size: " + stack.size());out.println("\tPeek: " + stack.peek() + "; After Size: " + stack.size());
}

尽管未在此处显示,但Trove在其gnu.trove.queue包中还支持Java的原始类型的先进先出(FIFO)队列结构。 该软件包中的类提供了遵循队列语义的方法: offer , poll和peek 。

使用JDK集合时, java.util.Collections类提供了许多有用的功能。 Trove提供了java.util.Collections功能的子集,用于在其自己的名为gnu.trove.TCollections的类中使用基于Trove的集合。 具体来说,在撰写本文时, TCollections类为同步和未修改的Trove集合提供支持。 下一个代码清单演示了如何使用TCollections ,还演示了如何使用Trove集合,该集合面向的数据类型不是double (在这种情况下为int )和其他数据结构类型(链接列表)。

展示了TCollections和TIntLinkedList

/*** Demonstrate one of Trove's "equivalent"s of the* java.util.Collections class.*/
public void demonstrateTroveCollectionsClass()
{final TIntLinkedList integers = new TIntLinkedList();integers.add(5);integers.add(7);integers.add(3);integers.add(1);final TIntList unmodifiableIntegers = TCollections.unmodifiableList(integers);try{unmodifiableIntegers.add(15);}catch (Exception ex){out.println("\tException caught: " + ex);}
}

当希望对基于Trove的集合进行迭代时,可以通过传统的迭代器对其进行访问,如下一个代码清单所示。 尽管在此示例中,集合和关联的迭代器在long值上起作用,但是Trove为Java的其他原始数据类型提供了类似的集合和迭代器。

使用Trove迭代器迭代Trove集合

/*** Demonstrate "traditional" iteration of a* Trove collection.*/
public void demonstrateIterationWithIterator()
{final TLongHashSet longs = new TLongHashSet();longs.add(15);longs.add(6);longs.add(12);longs.add(13);longs.add(2);TLongIterator longIterator = longs.iterator();while (longIterator.hasNext()){final long longValue = longIterator.next();out.println(longValue);}
}

迭代Trove集合的另一种方法是使用Procedure 。 下面的两个代码清单对此进行了演示。 第一个清单演示了一个自定义的面向long过程的过程,第二个清单演示了将该自定义过程通过其forEach方法应用于TLongLinkedList上的迭代。

使用Trove过程迭代Trove集合

/*** Demonstrate iteration of a Trove collection* using a Procedure.*/
public void demonstrateIterationWithProcedure()
{final TLongLinkedList longs = new TLongLinkedList();longs.add(15);longs.add(6);longs.add(12);longs.add(13);longs.add(2);longs.forEach(new StandardOutputLongProcedure());
}

先前迭代示例中使用的过程实现

package dustin.examples.trove;import static java.lang.System.out;import gnu.trove.procedure.TLongProcedure;/*** Simple implementation of TLongProcedure that* iterates over Trove collection of {@code long}* values and writes those values to standard* output with one value per line.*/
public class StandardOutputLongProcedure implements TLongProcedure
{@Overridepublic boolean execute(long longValue){out.println(longValue);return true;}
}

值得注意的是,Trove集合倾向于提供forEachDescending方法以及以相反顺序提供迭代。

与GNU Trove相关的其他观察

  • GNU Trove是一个提供“ Java的高速常规和原始集合”的库,不应与Trove混淆,后者是“ OpenStack的数据库即服务 ”。
  • Trove集合和数据结构的名称都以“ T”开头(对于Trove)。 实际上,除了HashingStrategy , IdentityHashingStrategy和Version之外,Trove中的所有类和接口都以“ T” 开头 。
  • Trove集合通常提供一个接受其基础数据类型数组的构造函数,并提供toArray()方法以原始数组的形式提供其数据元素。
  • Trove集合通常提供显式覆盖的toString()实现,这些实现允许像JDK集合一样轻松编写各个数据元素,并且与Java数组(需要Arrays.toString()方法)不同。
  • 有关Trove的其他详细信息,请参见概述 , 常见问题解答和消息论坛 。 其他资源包括使用此Treasure Trove增强集合性能 , Java HashMap性能 , Java高性能库以及TROVE – Java高性能集合 。
  • Trove的Java程序包通常按数据结构类型进行组织,对于同一数据包中给定的数据结构类型,所有特定于基本类型的实现都可以进行组织。 例如,软件包的名称类似于gnu.trove.list , gnu.trove.set等。
  • 因为每个Trove集合都特定于特定的原始数据类型,所以每个集合都不需要通用参数,并且没有与通用相关的问题(例如擦除)。 此方法还允许每个集合支持特定于该集合中存储的数据类型的方法。 例如,数字类型的集合可以提供sum方法,而特定于字符类型的集合可以提供grep方法。

结论

在许多常见用法中,由JDK提供的集合将表现良好,并且存储对象引用可能不是问题。 但是,在某些情况下,使用Trove集合(尤其是存储基元而不是对象引用)的能力可能会提供必要的优势。 随着集合变大,在集合中存储基元而不是它们的等效对象引用的优势变得更加明显。

翻译自: https://www.javacodegeeks.com/2016/01/discovering-trove-java-primitives-collection-handling.html

运动基元

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

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

相关文章

python判断奇偶数字符串的拼接_Python字符串拼接方法总结

这篇文章主要介绍了Python字符串拼接的几种方法整理的相关资料,这里提供了五种方法及实现&#xff0c;需要的朋友可以参考下Python字符串拼接的几种方法整理第一种 通过加号()的形式print(第一种方式通过加号形式连接 &#xff1a; lovePython \n)第二种 通过逗号(,)的形式pr…

Split分离通道

#include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2\opencv.hpp> using namespace cv; using namespace std;int main() {vector<Mat>cha;Mat b, g, r,dst;//1.加载两幅图片…

上下文异常中的上下文属性_在没有适当上下文的情况下引发异常是一种不良习惯...

上下文异常中的上下文属性Allison Anders等人的《四个房间》&#xff08;1995&#xff09;。 我不断重复同样的错误。 因此&#xff0c;该停止并制定规则以防止这种情况了。 错误不是致命的&#xff0c;但很烦人。 当查看生产日志时&#xff0c;经常会看到类似"File does…

最大公约数简便算法_求最大公约数的4种算法

for(z0; z<10000000; z) 循环只是为了增加程序的运行时间&#xff0c;让我们体会算法的时间复杂度。算法一&#xff1a;短除法想法&#xff0c;采用短除法找出2个数的所有公约数&#xff0c;将这些公因子相乘&#xff0c;结果就是2个数的最大公约数。【找公因子&#xff0c;…

java 编写代码_如果您在2015年编写过Java代码-这是您不容错过的趋势

java 编写代码去年我们有机会遇到的最有趣趋势的实用概述 在这篇文章中&#xff0c;我们回顾了构成我们2015年对话的5个主题和新发展。与其他许多年终总结保持较高水平的不同&#xff0c;我们将做一个更实际的操作不用流行语 。 好吧&#xff0c;没有太多*流行语。 与往常一样…

java自动生成合同_Java 7和Java 8之间的细微自动关闭合同更改

java自动生成合同Java 7的try-with-resources语句和与该语句一起使用的AutoCloseable类型的一个不错的功能是&#xff0c;静态代码分析工具可以检测到资源泄漏。 例如&#xff0c;Eclipse&#xff1a; 当您具有上述配置并尝试运行以下程序时&#xff0c;您将收到三个警告&…

Python学习(1)

1.str字符串操作 len(str) 计算字符串长度 str.replace(xxx,xxxx) 替换指定字符 str.upper()字符串转大写 str.lower()字符串转小写 str.strip()删除左右多余的空格 str.lstrip()删除左边多余的空格 str.rstrip()删除右边的空格 format(a,b,c) 传参显示 2.索引 out hello wo…

opencv求两张图像光流_光流(optical flow)和openCV中实现

转载请注明出处&#xff01;&#xff01;&#xff01;光流(optical flow)和openCV中实现光流的概念&#xff1a;是Gibson在1950年首先提出来的。它是空间运动物体在观察成像平面上的像素运动的瞬时速度。是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一…

storm apache_Apache Storm的实时情绪分析示例

storm apache实时情感分析是指处理自然语言文本&#xff08;或语音&#xff09;流以提取主观信息。 琐碎的用例用于构建推荐引擎或查找社交媒体趋势。 我选择了Apache Storm作为实时处理引擎。 Storm非常强大&#xff08;我们正在生产中使用它&#xff09;&#xff0c;并且非常…

怎么用python画圆的公式_怎么用python画圆

python中内置了许多第三方库&#xff0c;来帮助它完成各种功能。Turtle库就是Python语言中一个很流行的绘制图像的函数库(推荐学习&#xff1a;Python视频教程)Turtl库用于绘制线、圆、其他形状或者文本这个库被介绍为一个最常用的用来给孩子们介绍编程知识的方法库&#xff0c…

嵌入式java基准测试_Java正则表达式库基准测试– 2015年

嵌入式java基准测试在尝试使Java在计算机语言基准游戏的regexdna挑战中排名第一时&#xff0c;我正在研究Java正则表达式库的性能。 我可以找到的最新网站是2010年的tusker.org 。因此&#xff0c;我决定使用Java Microbenchmarking Harness重做测试并发布结果&#xff08;破坏…

libgdx和unity_libgdx和Kotlin –类[2D平台原型]

libgdx和unity这篇文章是libgdx和Kotlin文章的后续文章。 我已经决定开发一个简单的2D平台程序的原型&#xff08;沿着我的早期文章中的Star Assault进行介绍&#xff09;&#xff0c;但是我一直在使用和学习Kotlin&#xff0c;而不是Java。 对于本教程&#xff0c;该项目应处…

java1.7开发环境_在Windows平台搭建Java 1.7开发环境

OS&#xff1a;Windows 7 or laterJava Version: 1.7.x本文具体的演示环境是&#xff1a;Windows 8.1&#xff0c;Java 1.7.0_45。一、安装JDK需要注意的是安装路径中不要出现非西文符号。实际上我一般喜欢在安装路径中也尽可能不出现空格。比如&#xff1a;在我的PC上&#xf…

gluon_带有Gluon Ignite和Dagger的JavaFX中的依赖注入

gluon依赖注入抽象框架Gluon Ignite在几个流行的依赖注入框架&#xff08;例如Spring&#xff0c;Dagger和Guice&#xff09;上创建了一个通用抽象。 目前&#xff0c;Gluon 页面仅包含一个示例&#xff0c;该示例使用Gluon Ignite和Google Guice作为依赖注入框架&#xff0c;…

couchbase_具有Couchbase,Java EE和WildFly的CRUD Java应用程序

couchbaseCouchbase是一个开源的NoSQL文档数据库。 它允许访问&#xff0c;索引和查询JSON文档&#xff0c;同时利用集成的分布式缓存来实现高性能数据访问。 开发人员可以使用不同的语言&#xff08;Java&#xff0c;Go&#xff0c;.NET&#xff0c;Node&#xff0c;PHP&…

java 对象的态_Java面向对象-------多态总结

1.多态&#xff1a;是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口&#xff0c;使用不同的实例而执行不同操作&#xff0c;如图所示&#xff1a;多态性是对象多种表现形式的体现。2.多态作用&#xff1a;1. 消除类型之间的耦合关系2. 可替换性3. 可扩充性4…

netbeans连接数据库_NetBeans Java EE技巧#1 –数据库中的实体类

netbeans连接数据库NetBeans IDE是开发各种应用程序的绝佳选择。 具体来说&#xff0c;我每天都使用它来开发和维护Java EE应用程序。 在过去的几个发行版中&#xff0c;不仅Java EE的生产力提高了&#xff0c;而且NetBeans IDE还减少了开发应用程序的时间……使Java EE和NetBe…

jboss fuse 教程_使用JBoss Fuse和OpenShift进行Cloud Native Camel骑行

jboss fuse 教程红帽公司最近发布了一个微服务集成工具包&#xff0c;用于在OpenShift v3的Docker和Kubernetes环境中运行我们的微服务。 为了帮助人们更好地理解这一点&#xff0c;我将Rider Auto应用程序迁移到一组微服务中&#xff0c;该应用程序已经存在了一段时间&#xf…

javaone_JavaOne 2015 –又一年,又向前迈进了一步

javaoneJavaOne 2015 San Francisco于10月25日至29日举行。 我很自豪地说这是我第九个人参加JavaOne&#xff0c;第七个人是演讲者&#xff0c;第四个人是Oracle员工&#xff0c;第三个人是内容委员会成员&#xff0c;第二个人是项目负责人。 我认为对于JavaOne来说&#xff0c…

lnp和mysql分开安装_毕业设计之LNP+DISCUZ +分离的数据库操作

环境介绍&#xff1a;CentOS6.9最小化安装https://nginx.org/download/nginx-1.16.1.tar.gzhttps://www.php.net/distributions/php-7.3.14.tar.gzhttps://cdn.mysql.com//Downloads/MySQL-5.7/mysql-boost-5.7.29.tar.gznginxphp主机&#xff1a;192.168.111.141mysql主机&…