byte
, int
, etc.) from a single template
to conserve memory and boost performance.
Why HPPC?
The Java Collections package is in many ways excellent, but it cannot be used for primitive types without autoboxing (which kills the runtime performance due to increased memory use and garbage collector overhead).
This library has slightly different design goals than Java Collections (and many other collection packages). For example, the internals of each class are open and subject to free hacking and tuning up to one's wishes.
Why not other primitive collection libraries?
There are a few projects implementing collections over primitive types: fastutil, Koloboke, PCJ, GNU Trove, Apache Primitive Collections.
Historically, some of these libraries were released on commercially forbidding licenses (fastutil) and others appeared to be abandoned (PCJ), so HPPC was created to fill this gap. Since then things have changed quite a lot (fastutil is now Apache-licensed, Koloboke has been released), but HPPC still remains a small memory footprint and does the job. If you require full Java collections compliance, try fastutil, or Koloboke, they are both very, very good.
Assumptions and goals of HPPC
We assume that:
From these assumptions stem the following design drivers:
-ea
switch). When the algorithm is
tested and verified, it can run with no additional overhead from
contract checks.Design and implementation assumptions
Object
types), but at the same time we want
specialized classes to be automatically-generated for primitive-types
(to limit memory consumption and boost performance due to JIT optimisations).Interfaces and their relation to Java Collections API
HPPC is not strictly modeled after Java Collections API, although we did
try to make the APIs look similar enough for comfortable use.
One particular thing largely missing in HPPC are "view" projections
(sublists or views over the collection of keys or values). Certain classes provide such views
(like {@linkplain com.carrotsearch.hppc.ObjectObjectHashMap
ObjectObjectHashMap
}), but for the most part, specific methods are
provided that accept ranges or closure-like filters. If performance is still unsatisfactory,
the internals of each class are available for direct manipulation.
Rough relationships between Java Collections classes and HPPC classes are presented in the table below.
Java Collections | HPPC (primitives) | HPPC (generics) | |
---|---|---|---|
bit sets | java.util.BitSet |
BitSet |
n/a |
array-backed lists | java.util.ArrayList , java.util.Vector |
[type]ArrayList |
{@linkplain com.carrotsearch.hppc.ObjectArrayList
ObjectArrayList<T> } |
stacks | java.util.Stack |
[type]Stack |
{@linkplain com.carrotsearch.hppc.ObjectStack
ObjectStack<T> } |
deques | java.util.ArrayDeque |
[type]ArrayDeque |
{@linkplain com.carrotsearch.hppc.ObjectArrayDeque
ObjectArrayDeque<T> } |
hash sets | java.util.HashSet |
[keyType]HashSet |
{@linkplain com.carrotsearch.hppc.ObjectHashSet
ObjectHashSet<K> }
[keyType]HashSet
|
hash maps | java.util.HashMap |
[keyType][valueType]HashMap |
{@linkplain com.carrotsearch.hppc.ObjectObjectHashMap
ObjectObjectHashMap<K, V> }
[keyType]ObjectHashMap<V>
Object[valueType]HashMap<K>
|
The method-level API of the corresponding types is also similar, but distinct differences exist (consult the JavaDoc of each class).
Interfaces and container inheritance
HPPC's interfaces are modeled to encapsulate the common functionality enforced from all the classes that implement a given interface. The interface hierarchy is loosely inspired by STL.
An overview of interfaces and their relationship to data structures implemented in HPPC is depicted graphically below.