web-dev-qa-db-ja.com

JavaでHashMapにnullキーまたは値を追加する用途は何ですか?

HashMapでは、1つのヌルキーと任意の数のヌル値を使用できます。それの使用は何ですか?

85
subhashis

私はあなたが求めていることを肯定していませんが、nullキーを使用したい場合の例を探しているなら、デフォルトのケースを表すためにマップでそれらを頻繁に使用します特定のキーが存在しない場合):

_Map<A, B> foo;
A search;
B val = foo.containsKey(search) ? foo.get(search) : foo.get(null);
_

HashMapは、nullキーを特別に処理します(nullオブジェクトで.hashCode()を呼び出すことはできません)が、null値は特別なものではなく、他のようにマップに格納されます

121
Michael Mrozek

1つの例は、ツリーのモデリングです。 HashMapを使用して、キーが親、値が子のリストであるツリー構造を表す場合、nullキーの値はルートノードになります。

28
tony

nullvaluesの使用例は、高価な操作(外部Webサービスの呼び出しなど)の結果のキャッシュとしてHashMapを使用する場合です。 nullを返す場合があります。

null値をマップに配置すると、特定のキーに対して操作が実行されなかった場合(cache.containsKey(someKey)falseを返す)と、操作は実行されましたが、null値を返しました(cache.containsKey(someKey)trueを返し、cache.get(someKey)nullを返します)。

null値がなければ、null応答を示すために特別な値をキャッシュに入れるか、単にその応答をキャッシュせずに毎回操作を実行する必要があります。

6
Zorac

これまでの回答では、nullキーを持つ価値があるとしか考えていませんが、質問ではany number of null values

HashMapのキーに対して値nullを保存する利点は、データベースなどと同じです。空の値(たとえば、文字列 "")を持つことと、持たないことの区別を記録できます。値(null)。

3
Eborbob

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;
    }
}
2
aroth

別の例:日付でデータをグループ化するために使用します。ただし、一部のデータには日付がありません。ヘッダー「NoDate」でグループ化できます

1
Anthone

Nullキーは、マップキーがBeanフィールドを表すUI選択用のデータをマップに保存する場合にも役立ちます。

対応するnullフィールド値は、たとえば、UI選択では「(選択してください)」として表されます。

0
Gunnar