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поруч. Крім того, це не те, що спроба зупинити неіснуючий або вже зупинений таймер - це те, що абонент, як правило, може відновити.