1. Обзор
В этом уроке мы обсудим, как получить первую пару ключ-значение из HashMap , не зная ключа.
Сначала мы будем использовать итератор, а затем поток, чтобы получить первую запись. Наконец, мы обсудим проблему, которую представляет HashMap , когда мы хотим получить первую запись, и как ее решить.
2. Использование итератора
Давайте рассмотрим, что у нас есть следующее HashMap<Целое число, строка> :
MaphashMap = new HashMap<>(); hashMap.put(5, "A"); hashMap.put(1, "B"); hashMap.put(2, "C");
В этом примере мы будем использовать итератор для получения первой пары ключ-значение. Итак, давайте создадим итератор в entryset из HashMap и вызовем метод next() для получения первой записи:
Iterator> iterator = hashMap.entrySet().iterator(); Map.Entry actualValue = iterator.next(); Map.Entry expectedValue = new AbstractMap.SimpleEntry (1, "B"); assertEquals(expectedValue, actualValue);
3. Использование потока Java
Другой подход заключается в использовании API потока Java. Давайте создадим поток в наборе записей и вызовем метод findFirst () , чтобы получить его первую запись:
Map.EntryactualValue = hashMap.entrySet() .stream() .findFirst() .get();
Map.EntryexpectedValue = new AbstractMap.SimpleEntry (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> iterator = hashMap.entrySet().iterator(); Map.Entry actualValue = iterator.next(); Map.Entry expectedValue = new AbstractMap.SimpleEntry (0, "D"); assertEquals(expectedValue, actualValue);
Как мы видим, первая запись снова изменилась (в данном случае на 0=D ). Это также доказывает, что HashMap не гарантирует порядок вставки.
Итак, если мы хотим сохранить порядок, мы должны использовать LinkedHashMap вместо :
MaplinkedHashMap = new LinkedHashMap<>(); linkedHashMap.put(5, "A"); linkedHashMap.put(1, "B"); linkedHashMap.put(2, "C"); linkedHashMap.put(0, "D"); Iterator > iterator = linkedHashMap.entrySet().iterator(); Map.Entry actualValue = iterator.next(); Map.Entry expectedValue = new AbstractMap.SimpleEntry (5, "A"); assertEquals(expectedValue, actualValue);
5. Заключение
В этой короткой статье мы обсудили различные подходы к получению первой записи из HashMap .
Наиболее важным моментом, который следует отметить, является то, что реализация HashMap не гарантирует никакого порядка вставки. Поэтому, если мы заинтересованы в сохранении порядка вставки, мы должны использовать LinkedHashMap .
Пример кода доступен на GitHub .