Одно предостережение: если вы хотите удалить элементы в середине итерации, вам нужно будет сделать это с помощью итератора (см. Ответ karim79). Однако изменение значений элементов допустимо (см. Map.Entry).
В Java существует несколько способов итерации по a Map. Давайте рассмотрим наиболее распространенные методы и рассмотрим их преимущества и недостатки. Поскольку все карты в Java реализуют интерфейс Map, следующие методы будут работать для любой реализации map (HashMap, TreeMap, LinkedHashMap, Hashtable и т.д.)
Метод № 1: перебор записей с использованием цикла For-Each.
Это наиболее распространенный метод и предпочтительнее в большинстве случаев. Его следует использовать, если вам нужны как ключи карты, так и значения в цикле.
Обратите внимание, что цикл For-Each был введен в Java 5, поэтому этот метод работает только в более новых версиях языка. Также цикл For-Each приведет к сбою NullPointerException если вы попытаетесь выполнить итерацию по карте, имеющей значение null, поэтому перед выполнением итерации вы всегда должны проверять наличие нулевых ссылок.
Метод № 2: перебор ключей или значений с использованием цикла For-Each.
Если вам нужны только ключи или значения из карты, вы можете выполнить итерацию по набору ключей или значений вместо entrySet .
Вы также можете использовать ту же технику для итерации по keySet значениям or.
Этот метод может показаться избыточным, но у него есть свои преимущества. Прежде всего, это единственный способ итерации по карте в старых версиях Java. Другой важной особенностью является то, что это единственный метод, который позволяет удалять записи с карты во время итерации путем вызова iterator.remove(). Если вы попытаетесь сделать это во время For-Каждой итерации, вы получите "непредсказуемые результаты" в соответствии с Javadoc.
С точки зрения производительности этот метод равен Для каждой итерации.
Метод №4: перебор ключей и поиск значений (неэффективно).
Это может выглядеть как более чистая альтернатива методу № 1, но на практике это довольно медленно и неэффективно, поскольку получение значений по ключу может занять много времени (этот метод в разных реализациях Map работает на 20% -200% медленнее, чем метод № 1). Если у вас установлены FindBugs, он обнаружит это и предупредит вас о неэффективной итерации. Этого метода следует избегать.
Заключение:
Если вам нужны только ключи или значения из карты, используйте метод № 2. Если вы застряли на более старой версии Java (менее 5) или планируете удалять записи во время итерации, вам придется использовать метод № 3. В противном случае используйте метод #1.