(Есть некоторые вопросы об эффективных по времени разреженных массивах, но я ищу эффективность использования памяти.)
Мне нужен эквивалент List<T>
или Map<Integer,T>
, который
- Может увеличиваться по требованию, просто устанавливая ключ больше, чем любой ранее встречавшийся. (Можно предположить, что ключи неотрицательны.)
- Примерно так же эффективно по памяти, как
ArrayList<T>
, в случае, если большинство индексов неnull
, т.е. когда фактические данные не очень разрежены. - Когда индексы разрежены, занимает пространство, пропорциональное количеству индексов, отличных от
null
. - Использует меньше памяти, чем
HashMap<Integer,T>
(поскольку это автоматически упаковывает ключи и, вероятно, не использует преимущества скалярного типа ключа). - Может получить или установить элемент в амортизированном логарифмическом (N) времени, где N — количество записей: не обязательно линейное время, допустим двоичный поиск.
- Реализовано в невирусной библиотеке Java с открытым исходным кодом (предпочтительно в Maven Central).
Кто-нибудь знает о таком служебном классе?
Я ожидал, что он будет в коллекции Commons, но, похоже, этого не произошло.
Я наткнулся на org.apache.commons.math.util.OpenIntToFieldHashMap
, который выглядит почти правильно, за исключением того, что тип значения — FieldElement
, который кажется необоснованным; Я просто хочу T extends Object
. Похоже, что было бы легко отредактировать его исходный код, чтобы сделать его более общим, хотя я бы предпочел использовать двоичную зависимость, если она доступна.