HashMapでは、1つのヌルキーと任意の数のヌル値を使用できます。それの使用は何ですか?
私はあなたが求めていることを肯定していませんが、nullキーを使用したい場合の例を探しているなら、デフォルトのケースを表すためにマップでそれらを頻繁に使用します特定のキーが存在しない場合):
_Map<A, B> foo;
A search;
B val = foo.containsKey(search) ? foo.get(search) : foo.get(null);
_
HashMap
は、nullキーを特別に処理します(nullオブジェクトで.hashCode()
を呼び出すことはできません)が、null値は特別なものではなく、他のようにマップに格納されます
1つの例は、ツリーのモデリングです。 HashMapを使用して、キーが親、値が子のリストであるツリー構造を表す場合、null
キーの値はルートノードになります。
null
valuesの使用例は、高価な操作(外部Webサービスの呼び出しなど)の結果のキャッシュとしてHashMap
を使用する場合です。 null
を返す場合があります。
null
値をマップに配置すると、特定のキーに対して操作が実行されなかった場合(cache.containsKey(someKey)
がfalse
を返す)と、操作は実行されましたが、null
値を返しました(cache.containsKey(someKey)
はtrue
を返し、cache.get(someKey)
はnull
を返します)。
null
値がなければ、null
応答を示すために特別な値をキャッシュに入れるか、単にその応答をキャッシュせずに毎回操作を実行する必要があります。
これまでの回答では、null
キーを持つ価値があるとしか考えていませんが、質問ではany number of null values
。
HashMapのキーに対して値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;
}
}
別の例:日付でデータをグループ化するために使用します。ただし、一部のデータには日付がありません。ヘッダー「NoDate」でグループ化できます
Nullキーは、マップキーがBeanフィールドを表すUI選択用のデータをマップに保存する場合にも役立ちます。
対応するnullフィールド値は、たとえば、UI選択では「(選択してください)」として表されます。