Memory-efficient sparse array in Java
java, memory, sparse-array
Solution
I would try with trove collections, there is TIntObjectMap which can work for your intents.
Problem
(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 not `null`, 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.