Перейти к основному содержимому

Как проверить, существует ли ключ на карте

· 2 мин. чтения

1. Обзор

В этом кратком руководстве мы рассмотрим способы проверки наличия ключа в карте .

В частности, мы сосредоточимся на containsKey и get.

2. содержитКлюч

Если мы посмотрим на JavaDoc для Map#containsKey :

Возвращает true , если эта карта содержит сопоставление для указанного ключа

Мы видим, что этот метод является довольно хорошим кандидатом для того, чтобы делать то, что мы хотим.

Давайте создадим очень простую карту и проверим ее содержимое с помощью containsKey :

@Test
public void whenKeyIsPresent_thenContainsKeyReturnsTrue() {
Map<String, String> map = Collections.singletonMap("key", "value");

assertTrue(map.containsKey("key"));
assertFalse(map.containsKey("missing"));
}

Проще говоря, containsKey сообщает нам, содержит ли карта этот ключ.

3. получить

Теперь get тоже иногда может работать, но он имеет некоторый багаж, в зависимости от того, поддерживает ли реализация Map нулевые значения.

Снова взглянув на JavaDoc Map, на этот раз для Map #put , мы видим, что он вызовет только исключение NullPointerException :

если указанный ключ или значение является нулевым, и эта карта не допускает нулевых ключей или значений

Поскольку некоторые реализации Map могут иметь нулевые значения (например , HashMap ), get может возвращать null даже при наличии ключа.

Итак, если наша цель — увидеть, имеет ли ключ значение, то get сработает:

@Test
public void whenKeyHasNullValue_thenGetStillWorks() {
Map<String, String> map = Collections.singletonMap("nothing", null);

assertTrue(map.containsKey("nothing"));
assertNull(map.get("nothing"));
}

Но если мы просто пытаемся проверить, что ключ существует, то мы должны использовать containsKey .

4. Вывод

В этой статье мы рассмотрели containsKey . Мы также более подробно рассмотрели, почему рискованно использовать get для проверки существования ключа.

Как всегда, ознакомьтесь с примерами кода на Github .