HashMap допускає один нульовий ключ і будь-яку кількість нульових значень. Яка користь від цього?
ConcurrentHashMap
вона не підтримує нульові клавіші, тоді як HashMap
підтримує.
HashMap допускає один нульовий ключ і будь-яку кількість нульових значень. Яка користь від цього?
ConcurrentHashMap
вона не підтримує нульові клавіші, тоді як HashMap
підтримує.
Відповіді:
Я не впевнений у тому, що ви запитуєте, але якщо ви шукаєте приклад того, коли хотіли б використовувати нульовий ключ, я часто використовую їх на картах для представлення регістру за замовчуванням (тобто значення, яке слід використовувати якщо заданий ключ відсутній):
Map<A, B> foo;
A search;
B val = foo.containsKey(search) ? foo.get(search) : foo.get(null);
HashMap
спеціально обробляє нульові ключі (оскільки він не може викликати .hashCode()
нульовий об'єкт), але нульові значення не є чимось особливим, вони зберігаються на карті як будь-що інше
HashMap
( putForNullKey
), який обробляє його; він зберігає це в таблиці 0
B val = foo.containsKey(search) ? foo.get(search) : foo.get(null);
я думаю, ми можемо просто викликати метод get за ключем пошуку, який матиме той самий результат. B val = foo.get(search);
не могли б ви виправити мене, якщо я щось помиляюся?
val
в null
разі , якщо ключ не існує; mine встановлює його на будь-які null
карти на карті. У цьому була суть, я зберігаю ненульове значення за замовчуванням у null
ключі на карті і використовую його, якщо фактичний ключ не існує
Одним із прикладів використання null
значень є використання HashMap
кеша як результату дорогої операції (наприклад, виклику зовнішньої веб-служби), яка може повернутися null
.
null
Потім введення значення на карту дозволяє розрізнити випадок, коли операція не була виконана для даного ключа ( cache.containsKey(someKey)
повертається false
), і де операція була виконана, але повернуло null
значення ( cache.containsKey(someKey)
повертає true
, cache.get(someKey)
повертає null
).
Без null
значень вам доведеться або ввести якесь спеціальне значення в кеш, щоб вказати null
відповідь, або просто взагалі не кешувати цю відповідь і виконувати операцію кожного разу.
Поки що відповіді лише вважають, що варто мати null
ключ, але питання також задає питання any number of null values
.
Перевага зберігання значення null
проти ключа в HashMap така ж, як і в базах даних тощо - ви можете записати різницю між значенням, яке є порожнім (наприклад, рядок ""), і відсутністю значення взагалі (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
поруч. Крім того, це не те, що спроба зупинити неіснуючий або вже зупинений таймер - це те, що абонент, як правило, може відновити.