1. Обзор
В этом руководстве мы обсудим, как получить первую пару ключ-значение из HashMap
, не зная ключа.
Сначала мы будем использовать итератор, а затем поток, чтобы получить первую запись. Наконец, мы обсудим проблему, которую представляет HashMap
, когда мы хотим получить первую запись, и как ее решить.
2. Использование итератора
Предположим, у нас есть следующий HashMap<Integer, String>
:
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
Другой подход заключается в использовании Java Stream API. Давайте создадим поток для набора
записей и вызовем метод 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. Проблема с порядком размещения
Чтобы представить эту проблему, давайте вспомним, как мы создали hashMap
, пара 5=A
была вставлена как первая запись, затем 1=B
и, наконец, 2=C
. Давайте проверим это, распечатав содержимое нашего HashMap
:
System.out.println(hashMap);
{1=B, 2=C, 5=A}
Как видим, порядок не тот. Реализация класса HashMap
не гарантирует порядок вставки .
Теперь добавим в 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);
Как мы видим, первая запись снова изменилась ( в данном случае на 0=D ).
Это также доказывает, что HashMap
не гарантирует порядок вставки.
Итак, если мы хотим сохранить порядок, мы должны вместо этого использовать LinkedHashMap
:
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);
5. Вывод
В этой короткой статье мы обсудили различные подходы к получению первой записи из HashMap
.
Самое важное, что следует отметить, это то, что реализация HashMap
не гарантирует какой-либо порядок вставки. Итак, если мы заинтересованы в сохранении порядка вставки, мы должны использовать LinkedHashMap
.
Пример кода доступен на GitHub .