Порядок итераций в Google Collections ImmutableMap - PullRequest
24 голосов
/ 28 сентября 2010

Мне нужна комбинация Google Collection ImmutableMap и LinkedHashMap - неизменяемая карта с заданным порядком итераций.Кажется, что сам ImmutableMap фактически определил порядок итераций, по крайней мере, его документация гласит: :

Неизменяемая карта на основе хеша с надежным пользовательским порядком итераций.

Однако подробностей больше нет.Быстрый тест показывает, что это может быть правдой, но я хочу убедиться.

Мой вопрос: могу ли я рассчитывать на порядок итераций ImmutableMap?Если я сделаю ImmutableMap.copyOf(linkedHashMap), будет ли он иметь тот же порядок итераций, что и исходная связанная хэш-карта?Как насчет неизменных карт, созданных строителем?Некоторая ссылка на авторитетный ответ поможет, так как Google не нашел ничего полезного.(И нет, ссылки на источники не учитываются).

Ответы [ 3 ]

25 голосов
/ 28 сентября 2010

Я действительно нашел обсуждение этого вопроса с ответами от авторов библиотеки :

Кевин Бурриллион: «пользовательский» означает, что «это может быть любой порядок, который вы хотите» быть "; другими словами, в любом порядке вы предоставляете нам записи в Во-первых, это порядок, который мы используем.

Джаред Леви: Вы также можете скопировать TreeMap или LinkedHashMap, которые имеют желаемый порядок.

Да, я должен был поверить в Javadoc, хотя я думаю, что Javadoc может быть лучше в этом случае. Кажется, я не первый, кто был смущен этим. Если ничто иное, этот Q / A поможет Google в следующий раз, когда кто-то ищет «итерацию ImmutableMap»: -)

20 голосов
/ 01 октября 2010

Точнее, фабричные методы и сборщик ImmutableMap возвращают экземпляры, которые следуют порядку итераций входных данных, предоставленных при построении карты. Тем не менее, ImmutableSortedMap, который является подклассом ImmutableMap. сортирует ключи.

5 голосов
/ 28 сентября 2010

Вы должны верить Javadoc. Если этого недостаточно, прочитайте исходный код или сообщите об ошибке.

Быстрый просмотр исходного кода показывает, что карта поддерживается массивом, итерация будет выполняться через ImmutableSet, который также поддерживается массивом. Поэтому я думаю, что документация правильная и порядок элементов будет сохранен как есть.

...