HashMapでは、1つのnullキーと任意の数のnull値を使用できます。それの用途は何ですか?
ConcurrentHashMap
nullキーはサポートされていませんが、サポートされていますHashMap
。
HashMapでは、1つのnullキーと任意の数のnull値を使用できます。それの用途は何ですか?
ConcurrentHashMap
nullキーはサポートされていませんが、サポートされていますHashMap
。
回答:
私はあなたが何を求めているかについては肯定的ではありませんが、nullキーを使用したい場合の例を探している場合は、デフォルトのケース(つまり、使用する値)を表すためにマップでよく使用します指定されたキーが存在しない場合):
Map<A, B> foo;
A search;
B val = foo.containsKey(search) ? foo.get(search) : foo.get(null);
HashMap
nullキーを特別に処理します(.hashCode()
nullオブジェクトを呼び出すことができないため)が、null値は特別なものではなく、他のようにマップに格納されます
HashMap
(putForNullKey
)にはそれを処理する特別なメソッドがあります。それをテーブル0に保存します
B val = foo.containsKey(search) ? foo.get(search) : foo.get(null);
私は、同じ結果になる検索キーでgetメソッドを呼び出すだけでよいと思います。 B val = foo.get(search);
何か問題が発生した場合、私を訂正していただけませんか?
val
れnull
ます。私はそれをnull
マップ内のどのマップにも設定します。それがポイントでした、私はデフォルトの非null値をnull
マップのキーに格納し、実際のキーが存在しない場合はそれを使用します
null
値の使用例の1つは、をHashMap
返す可能性のある負荷の高い操作(外部Webサービスの呼び出しなど)の結果のキャッシュとしてを使用する場合null
です。
null
マップに値を置くと、特定のキーに対して操作が実行されなかった場合(cache.containsKey(someKey)
returns false
)と、操作は実行されたがnull
値をcache.containsKey(someKey)
返した場合(returns true
、cache.get(someKey)
returns null
)を区別できます。
null
値がない場合、null
応答を示すためにキャッシュに特別な値を入れるか、単にその応答をまったくキャッシュせずに毎回操作を実行する必要があります。
これは、null
キーが役立つ可能性があるケースの、私のわずかに工夫された唯一の例です。
public class Timer {
private static final Logger LOG = Logger.getLogger(Timer.class);
private static final Map<String, Long> START_TIMES = new HashMap<String, Long>();
public static synchronized void start() {
long now = System.currentTimeMillis();
if (START_TIMES.containsKey(null)) {
LOG.warn("Anonymous timer was started twice without being stopped; previous timer has run for " + (now - START_TIMES.get(null).longValue()) +"ms");
}
START_TIMES.put(null, now);
}
public static synchronized long stop() {
if (! START_TIMES.containsKey(null)) {
return 0;
}
return printTimer("Anonymous", START_TIMES.remove(null), System.currentTimeMillis());
}
public static synchronized void start(String name) {
long now = System.currentTimeMillis();
if (START_TIMES.containsKey(name)) {
LOG.warn(name + " timer was started twice without being stopped; previous timer has run for " + (now - START_TIMES.get(name).longValue()) +"ms");
}
START_TIMES.put(name, now);
}
public static synchronized long stop(String name) {
if (! START_TIMES.containsKey(name)) {
return 0;
}
return printTimer(name, START_TIMES.remove(name), System.currentTimeMillis());
}
private static long printTimer(String name, long start, long end) {
LOG.info(name + " timer ran for " + (end - start) + "ms");
return end - start;
}
}
throw Exception
。その上、それは存在しないかすでに停止されたタイマーを止めようとする試みが一般に呼び出し者が回復することができるものであるようではありません。