有什么方法可以有效地HashMap
从一个(或另一个合适的Map
)获取密钥(或整个条目) ?
在有人说之前,我从不需要它:我需要。我有一个这样的循环
for (long i=0; i<1e12; ++i) {
Key key = new Key(i);
Value value = map.get(key);
if (something(key, value)) list.add(key);
}
如果我可以用类似的东西 替换(新实例将有资格获得 GC),那么我key
不必要地占用了可以保存的内存。虽然它们是相等的,但重用旧实例会节省内存。list.add(key)
list.add(map.getKey(key))
我知道我可以将密钥嵌入到值中或使用 Guava 的Interner
; 两者都有帮助,但都需要一些内存。
解决一些误解评论:如果效率不是问题,则可以执行以下操作
Key getKeyFromMap(Key key, Map<Key, ?> map) {
for (Key key2 : map.keySet()) {
if (key.equals(key2)) return key2;
}
return null;
}
接受的答案中描述的最有效的解决方案:
public static <K, V> K getKey(K key, HashMap<K, V> map) {
final Entry<K, V> entry = map.getEntry(key);
return entry==null ? null : entry.getKey();
}
问题是它必须放入package java.util
,因为它使用包私有方法。使用这种方法可能很危险,但在我的“运行一次”用例中没有问题。