HPPC的设想和目标
设想
程序员知道自己在做什么,并可能希望直接访问特定集合的类的内部存储(例如,不使用预定义的迭代器)绝大多数情况下程序使用单线程访问。例如,有一个在并发修改的重复验证的小点。使用原始集合的程序在开发期间使用单元测试和回归测试,所以他们在生产系统中的行为不会被严格验证(我们可以假设使用集合类的代码不会违反给出的一组断言)
从上面这些假设建立以下设计思想:
在HPPC中数据类型尽可能简单,对终端代码里的任何优化公开其内部存储。参数验证和状态有效性校验可以使用断言。这意味着约束仅仅能够检查请求是否在运行是发出(java1.4版本以上),当程序被测试和验证时,它运行从约束中检查不会有额外的开销。我们试图避免复杂的接口层次,尽管为了更明确而定义了特定的接口。程序员在设计时应该还是会选择合适的数据结构,并且应该知道自己在做什么。HPPC为大多数普通任务例如,过滤,迭代以及合并提供了工具,但是这些工具通常比实现低层次的对数据存储的直接访问更昂贵(如果需要的话可以使用)。对数据序列化没有特别的支持。这个实现不是线程安全的,并且不会试图提供快速的并发问题检测。
设计与实现
我们希望HPPC类模板可以实现为普通的Java类,以便典型的编程工具可用于开发,测试等。我们希望HPPC类模板可被用作通常的集合类(适用于封装的数值类型或其它对象类型),但同时我们希望特殊的类能够自动转化为一般类型(为了限制内存消耗并且提高效率由于JIT优化)
接口以及与Java集合API的关系
HPPC并不是严格按照Java集合API来制定的,尽管为了更便捷地使用我们的确尽量让HPPC API接近Java集合API。在很大程度上HPPC中缺少一个特别的是“视图”部分(子列表或具有键或值的集合)。特定的类提供了这些视图(例如ObjectObjectHashMap),但是对大部分来说,提供特殊的方法以接收范围和闭合的过滤器。如果表现仍不尽人意,每一个类的内部可用于直接操作。Java集合类和HPPC类之间的基本关系见下表。
相应类型的方法级的API也相似,但差异也是存在的(参考相应类的Java文档)。
下面让我们来看看它的实现方法,HPPC的示例很少,这里引用的是官方示例。
1.新建一个Java项目,记得下载并引入HPPC的jar包以及JUnit库。
2.将示例中的Helpers和HppcExample_001_IteratingOverLists类复制到相应的包下
3.运行单元测试,可以看到由HPPC实现的List类速度的确快了不少,至于其它的,大家也可以一一试验。
开发资源
下载 v0.7.1、JavaDoc APIv0.7.0、JavaDoc API
API概述代码示例FAQ邮件列表
官方网站:https://labs.carrotsearch.com/hppc.html
开源地址:https://github.com/carrotsearch/hppc