运动基元

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

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

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

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

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

运动基元

运动基元_发现大量Java基元集合处理相关推荐

  1. java去重复的集合_如何去除Java中List集合中的重复数据

    1.循环list中的所有元素然后删除重复 public class duplicatRemoval { public static List removeDuplicate(List list){ f ...

  2. 纹理和基元_通过粘性仙人掌基元进行延迟加载和缓存

    纹理和基元 您显然知道什么是延迟加载 ,对吗? 而且您无疑知道缓存 . 据我所知,Java中没有一种优雅的方法来实现它们中的任何一个. 这是我在Cactoos原语的帮助下为自己找到的. Matteo ...

  3. 几何基元_.NET异步协调基元中的两种技术比较

    几何基元 Last week in my post on updating my Windows Phone 7 application to Windows 8 I shared some code ...

  4. sierpinski三角形的维数_谢宾斯基三角形的几种生成方法

    简介 谢宾斯基三角形(Sierpinski triangle)是一种分形,由波兰数学家谢宾斯基在1915年提出.它是一种自相似集. 几种生成方法 方法一:去掉中心 取一个实心的三角形(多数用等边三角形 ...

  5. iphone刷基带_揭秘:iPhone6S开机白苹果维修、安卓机刷基带分享

    原标题:揭秘:iPhone6S开机白苹果维修.安卓机刷基带分享 文 / 维修狮(FIXHOME) iPhone 6S开机白苹果维修案例 机器型号:iPhone 6S 故障现象:开机白苹果 iPhone ...

  6. 2 shell 锂基脂_壬二酸和癸二酸制备的复合锂基脂到底有那些差别!

    2019年12月21-22日 深圳<润滑脂生产技术培训班>烃基脂,钙基脂,锂基脂,复合锂基脂.铝基脂,复合铝,磺酸钙脂等润滑脂的生产配方设计及生产工艺和流程,专家现场答疑,报名咨询:189 ...

  7. iphone刷基带_基带有什么用?iPhone手机基带查询方法

    在查看苹果iPhone手机相关技巧或刷机的时候,我们经常会听到"基带"这个词,iPhone手机基带是什么?iPhone手机基带有什么用? "基带"一词对于绝大数 ...

  8. R语言多层桑基图_绘制炫酷桑基图,R语言(networkD3包)能搞定?

    你知道如何使用R语言绘制桑基图吗? 小锐当然知道啦,并且教你 绘制酷炫的桑基图. 开课啦 桑基图(Sankey)是一种特定类型的流程图,图中延伸的分支的宽度对应数据流量的大小,其最明显的特征就是,始末 ...

  9. core java文献翻译_外文翻译--Java技术介绍(适用于毕业论文外文翻译+中英文对照).doc...

    毕业设计(论文)外文资料翻译 学 院: 信息工程学院 专 业: 计算机科学与技术 姓 名: XXXXXXXXX 学 号: XXXXXXXXX 外文出处: Cay s.Horstmann Core Ja ...

最新文章

  1. 你知道Spring是怎么解析配置类的吗?
  2. linux文件管理和 对bash的理解
  3. android onclick执行顺序,浅谈onTouch先执行,还是onClick执行(详解)
  4. ios 怎么判断字符串的字节数_iOS 计算字符串长度-boundingRectWithSize:
  5. 《Puppet实战手册》——导读
  6. 【Vegas原创】SQL Server 2005部署备份任务
  7. JavaScript浏览器对象模型概述(1)
  8. 面试官问:请拿出一段体现你水平的代码时,该如何回答?
  9. 虚拟机安装教程win10_Win10封装教程1-VM虚拟机安装及配置
  10. C#仿““狗屁不通文章生成器””功能
  11. 条码打印工具-Bartender的使用
  12. PyCharm下载及安装教程(Windows)
  13. element-plus 更换主题色
  14. Word插入题注优化(自动删除标签与编号前的空格,编号后添加空格)
  15. QPrinter设置页面(pageSize)铺满纸张(paperSize)问题
  16. thingsboard使用地图和表可视化资产数据~看完还不会 你pan我
  17. 迷信自身专业者,守株待兔尔
  18. 2022年安全员-A证考题及答案
  19. [答学员问】对于低学历的我,想找一个培训机构学习Linux网络运维,哪个培训机构教学稍微好一点呢?
  20. 如果修改代码后,又想恢复修改之前的状态怎么办?

热门文章

  1. P6775-[NOI2020]制作菜品【贪心,dp】
  2. POJ1456-Supermarket【并查集】
  3. codeforces1452 E. Two Editorials
  4. 【线段树】FREQUENT - Frequent values(luogu-SP1684 / poj 3368)
  5. hdu4609 3idiots 三角形计数 FFT
  6. Google 出的 Guava 是个什么鬼
  7. JVM内存管理------垃圾搜集器参数精解
  8. 乐观锁的一种实现方式——CAS
  9. 厉害了,关于String的10道经典面试题
  10. 人脸检测解析json的工具类face_test