Если известно, что набор ключей находится в заданном диапазоне (как показано в вашем примере 1-1000000), то самым простым является использование массива.Проблема заключается в том, что вам нужно искать значения по ключу, и это ограничивает вас либо картой, либо массивом.
Далее используется карта значений для значений просто для того, чтобы избежать дублирования экземпляров объектов с одинаковыми значениями (может быть лучший способ сделать это, но я не могу думать ни о каком).Массив просто служит для поиска значений по индексу:
private static void addToArray(Integer[] array, int key,
Integer value, Map<Integer, Integer> map) {
array[key] = map.putIfAbsent(value, value);
}
И затем значения могут быть добавлены с помощью:
Map<Integer, Integer> keys = new HashMap<>();
Integer[] largeArray = new Integer[1000001];
addToArray(largeArray, 1, 4, keys);
addToArray(largeArray, 2, 232, keys);
...
addToArray(largeArray, 1000000, 4, keys);
Если new Integer[1000001]
кажется хаком, вы все равно можете сохранитьсвоего рода «смещение индекса» для указания фактического ключа, связанного с индексом 0
в массиве.
И я бы поместил это в класс:
class LargeMap {
private Map<Integer, Integer> keys = new HashMap<>();
private Integer[] keyArray;
public LargeMap(int size) {
this.keyArray = new Integer[size];
}
public void put(int key, Integer value) {
this.keyArray[key] = this.keys.putIfAbsent(value, value);
}
public Integer get(int key) {
return this.keyArray[key];
}
}
И:
public static void main(String[] args) {
LargeMap myMap = new LargeMap(1000_000);
myMap.put(1, 4);
myMap.put(2, 232);
myMap.put(1000_000, 4);
}