如果已知键集在给定范围内(如示例中所示的 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);
}