Если у меня есть объект, реализующий интерфейс Map в Java, и я хочу перебирать каждую содержащуюся в нем пару, каков наиболее эффективный способ прохождения карты?
Если эффективность цикла ключей является приоритетом для вашего приложения, выберите Mapреализацию, которая поддерживает ключи в нужном вам порядке.
Будет ли порядок элементов зависеть от конкретной реализации карты, которую я имею для интерфейса?
Да, конечно.
- Несколько
Map реализации обещают определенный порядок итераций, другие нет.
- Различные реализации
Mapподдерживают различный порядок пар ключ-значение.
Посмотрите эту таблицу, которую я создал, суммируя различные Mapреализации, связанные с Java 11. В частности, обратите внимание на столбец порядка итераций . Нажмите / нажмите, чтобы увеличить.

Вы можете видеть, что есть четыре Mapреализации, поддерживающие порядок :
TreeMap
ConcurrentSkipListMap
LinkedHashMap
EnumMap
NavigableMap интерфейс
Два из них реализуют NavigableMapинтерфейс: TreeMap& ConcurrentSkipListMap.
Более старый SortedMapинтерфейс эффективно вытесняется более новым NavigableMapинтерфейсом. Но вы можете найти сторонние реализации, реализующие только старый интерфейс.
Естественный порядок
Если вы хотите, Mapчтобы его пары располагались в «естественном порядке» ключа, используйте TreeMapили ConcurrentSkipListMap. Термин «естественный порядок» означает класс ключей, реализуемых Comparable. Значение, возвращаемоеcompareTo методом значение используется для сравнения при сортировке.
Изготовленный на заказ заказ
Если вы хотите указать собственную процедуру сортировки для ваших ключей, которая будет использоваться для поддержания порядка сортировки, передайте Comparatorреализацию, соответствующую классу ваших ключей. Используйте либо, TreeMapлибо ConcurrentSkipListMap, передавая Comparator.
Оригинальный порядок вставки
Если вы хотите, чтобы пары вашей карты были сохранены в их первоначальном порядке, в котором вы вставили их в карту, используйте LinkedHashMap.
Порядок определения перечисления
Если вы используете перечисление, такое как DayOfWeekили Monthкак ключи, используйте EnumMapкласс. Этот класс не только высоко оптимизирован, чтобы использовать очень мало памяти и работать очень быстро, он поддерживает ваши пары в порядке, определенном перечислением. Для DayOfWeek, например, ключ DayOfWeek.MONDAYбудет найден , когда первая итерация, а ключDayOfWeek.SUNDAY будет последним.
Другие соображения
При выборе Mapреализации также учитывайте:
- Значения NULL. Некоторые реализации запрещают / принимают NULL в качестве ключа и / или значения.
- Параллелизм. Если вы манипулируете картой между потоками, вы должны использовать реализацию, которая поддерживает параллелизм. Или оберните карту
Collections::synchronizedMap(менее предпочтительно).
Оба эти соображения рассматриваются в графической таблице выше.