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);
}
そして、私のようなもの key
に置き換えることができれば節約できるメモリを不必要に取ります(新しいインスタンスはGCの対象になります)。それらは同じですが、古いインスタンスを再利用するとメモリが節約されます。list.add(key)
list.add(map.getKey(key))
キーを値に埋め込むか、グアバの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
問題は、パッケージのプライベート メソッドを使用するため、配置する必要があることです。このような方法を使用するのは危険な場合がありますが、私の「1 回実行」のユース ケースでは問題ありません。