Рубрики
Без рубрики

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

Узнайте, как проверить, существует ли ключ в карте на Java, и об общей ловушке.

Автор оригинала: baeldung.

1. Обзор

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

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

2. containsKey

Если мы взглянем на JavaDoc для Map#containsKey :

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

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

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

@Test
public void whenKeyIsPresent_thenContainsKeyReturnsTrue() {
    Map map = Collections.singletonMap("key", "value");
    
    assertTrue(map.containsKey("key"));
    assertFalse(map.containsKey("missing"));
}

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

3. получить

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

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

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

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

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

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

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

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

4. Заключение

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

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