«1. Обзор

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

Сначала мы будем использовать итератор, а затем поток, чтобы получить первую запись. Наконец, мы обсудим проблему, которую представляет HashMap, когда мы хотим получить первую запись, и как ее решить.

2. Использование итератора

Предположим, у нас есть следующая HashMap\u003cInteger, String\u003e:

Map<Integer, String> hashMap = new HashMap<>();
hashMap.put(5, "A");
hashMap.put(1, "B");
hashMap.put(2, "C");

В этом примере мы будем использовать итератор для получения первой пары ключ-значение. Итак, давайте создадим итератор для набора записей HashMap и вызовем метод next() для получения первой записи:

Iterator<Map.Entry<Integer, String>> iterator = hashMap.entrySet().iterator();

Map.Entry<Integer, String> actualValue = iterator.next();
Map.Entry<Integer, String> expectedValue = new AbstractMap.SimpleEntry<Integer, String>(1, "B");

assertEquals(expectedValue, actualValue);

3. Использование потока Java

Другой подход заключается в использовании API потока Java. . Давайте создадим поток в наборе записей и вызовем метод findFirst(), чтобы получить его первую запись:

Map.Entry<Integer, String> actualValue = hashMap.entrySet()
  .stream()
  .findFirst()
  .get();
Map.Entry<Integer, String> expectedValue = new AbstractMap.SimpleEntry<Integer, String>(1, "B");

assertEquals(expectedValue, actualValue);

4. Проблема с порядком вставки

System.out.println(hashMap);
{1=B, 2=C, 5=A}

Чтобы представить эту проблему, давайте вспомним, как мы создали hashMap в качестве первой записи была вставлена ​​пара 5=A, затем 1=B и, наконец, 2=C. Давайте проверим это, распечатав содержимое нашего HashMap:

hashMap.put(0, "D");

Iterator<Map.Entry<Integer, String>> iterator = hashMap.entrySet().iterator();

Map.Entry<Integer, String> actualValue = iterator.next();
Map.Entry<Integer, String> expectedValue = new AbstractMap.SimpleEntry<Integer, String>(0, "D");

assertEquals(expectedValue, actualValue);

Как видим, порядок не тот. Реализация класса HashMap не гарантирует порядок вставки.

Теперь добавим еще один элемент в hashMap:

Map<Integer, String> linkedHashMap = new LinkedHashMap<>();
linkedHashMap.put(5, "A");
linkedHashMap.put(1, "B");
linkedHashMap.put(2, "C");
linkedHashMap.put(0, "D");

Iterator<Map.Entry<Integer, String>> iterator = linkedHashMap.entrySet().iterator();
Map.Entry<Integer, String> actualValue = iterator.next();
Map.Entry<Integer, String> expectedValue = new AbstractMap.SimpleEntry<Integer, String>(5, "A");

assertEquals(expectedValue, actualValue);

Как мы видим, первая запись снова изменилась (в данном случае на 0=D). Это также доказывает, что HashMap не гарантирует порядок вставки.

Итак, если мы хотим сохранить порядок, мы должны вместо этого использовать LinkedHashMap:

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

В этой короткой статье мы обсудили различные подходы к получению первой записи из HashMap.