(There are some questions about time-efficient sparse arrays but I am looking for memory efficiency.)
I need the equivalent of a List<T>
or Map<Integer,T>
which
- Can grow on demand just by setting a key larger than any encountered before. (Can assume keys are nonnegative.)
- Is about as memory-efficient as an
ArrayList<T>
in the case that most of the indices are notnull
, i.e. when the actual data is not very sparse. - When the indices are sparse, consumes space proportional to the number of non-
null
indices. - Uses less memory than
HashMap<Integer,T>
(as this autoboxes the keys and probably does not take advantage of the scalar key type). - Can get or set an element in amortized log(N) time where N is the number of entries: need not be linear time, binary search would be acceptable.
- Implemented in a nonviral open-source pure Java library (preferably in Maven Central).
Does anyone know of such a utility class?
I would have expected Commons Collections to have one but it did not seem to.
I came across org.apache.commons.math.util.OpenIntToFieldHashMap
which looks almost right except the value type is a FieldElement
which seems gratuitous; I just want T extends Object
. It looks like it would be easy to edit its source code to be more generic, though I would rather use a binary dependency if one is available.
OpenIntToFieldHashMap
to a generic value type, which seems to have worked with ~10min work, but it only performs marginally better thanTIntObjectMap
. – Popper