HashMap позволяет использовать один нулевой ключ и любое количество нулевых значений. Какая польза от этого?
Каково использование добавления нулевого ключа или значения в HashMap в Java?
Ответ 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.
Соответствующее значение нулевого поля, например, будет представлено как "(выберите)" в выборе пользовательского интерфейса.