Существует ли структура данных java, которая может хранить произвольно большое количество элементов? Предположим, что элементы также являются BigIntegers для простоты.
Теоретически использование массива с индексом BigInteger было бы приемлемо, поскольку установка и получение значений будут единственными необходимыми операциями. Но массив не может содержать больше, чем Integer.MAX_VALUE. (Или даже меньше, в зависимости от виртуальной машины, см. этот вопрос ).
Для реализации такой структуры данных простое (наивное) решение было бы создать его из LinkedList и иметь внешний счетчик BigInteger.
Что-то вроде этого:
class MyArray{
private final BigInteger size;
private final LinkedList<BigInteger> list;
MyArray(BigInteger size){
//ommited for simplicity
}
public BigInteger get(BigInteger index){
//ommited for simplicity
//traverse the LinkedList using a BigInteger counter and get the element
}
public void set(BigInteger index,BigInteger element){
//ommited for simplicity.
//traverse the LinkedList using a BigInteger counter and set the element
}
public BigInteger getSize(){
return size;
}
}
Однако должна быть возможность сделать несколько оптимизаций. Например, не инициализировать элементы, которые не были установлены или получены, или кэшировать часто запрашиваемые элементы. В этом смысле реализация Map также может быть хорошей реализацией. Однако карты возвращают размер int, и я не смог найти ссылку на то, может ли карта обрабатывать больше, чем Integer.MAX_VALUE. Я искал TreeMap и HashMap. Имеется ли такая структура данных произвольного размера?
Некоторые другие ограничения. 1 - Размер памяти не рассматривается как ограничение, однако сохранение памяти будет плюсом. 2. Структура данных предпочтительно хранится в памяти, поэтому решения на основе данных не рассматриваются. Например, вышеупомянутое также может быть реализовано путем сохранения значений в базе данных с индексом элемента, преобразованного в строку и используемым в качестве ключа строки.