Каково использование добавления нулевого ключа или значения в HashMap в Java?

HashMap позволяет использовать один нулевой ключ и любое количество нулевых значений. Какая польза от этого?

Ответ 1

Я не уверен, что вы спрашиваете, но если вы ищете пример того, когда вы хотите использовать нулевой ключ, я часто их использую на картах для представления случая по умолчанию (то есть значение, которое следует использовать, если данный ключ отсутствует):

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

HashMap обрабатывает нулевые ключи специально (поскольку он не может вызвать .hashCode() для нулевого объекта), но нулевые значения не являются чем-то особенным, они хранятся на карте, как и все остальное

Ответ 2

Например, для моделирования деревьев. Если вы используете HashMap для представления древовидной структуры, где ключ является родительским, а значение представляет собой список дочерних элементов, то значениями для ключа null будут корневые узлы.

Ответ 3

Одним из примеров использования для значений null является использование HashMap в качестве кеша для результатов дорогостоящей операции (например, вызов внешней веб-службы), который может возвращать null.

Ввод значения null на карте позволяет вам различать случай, когда операция не была выполнена для заданного ключа (cache.containsKey(someKey) возвращает false), и где операция была выполнена, но возвращена a null value (cache.containsKey(someKey) возвращает true, cache.get(someKey) возвращает null).

Без null значений вам нужно будет либо добавить какое-то особое значение в кеш, чтобы указать ответ null, либо просто не кэшировать этот ответ вообще и выполнять операцию каждый раз.

Ответ 4

Вот мой только несколько надуманный пример случая, когда ключ 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;
    }
}

Ответ 5

Ответы до сих пор учитывают ценность ключа null, но вопрос также спрашивает о any number of null values.

Преимущество сохранения значения null по отношению к ключу в HashMap такое же, как в базах данных и т.д. - вы можете записать различие между наличием пустого значения (например, строки "") и не иметь значение вообще (null).

Ответ 6

Другой пример: я использую его для группировки данных по дате. Но некоторые данные не имеют даты. Я могу сгруппировать его с заголовком "NoDate"

Ответ 7

Нулевой ключ также может быть полезен, когда карта хранит данные для выбора пользовательского интерфейса, где ключ карты представляет поле bean.

Соответствующее значение нулевого поля, например, будет представлено как "(выберите)" в выборе пользовательского интерфейса.