Если у меня есть объект, реализующий интерфейс 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
(менее предпочтительно).
Оба эти соображения рассматриваются в графической таблице выше.