«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.