Sobes.tech
Junior — Middle

Millised potentsiaalsed probleemid võivad tekkida HashMap-i muutmisel selle elementide läbimise ajal?

sobes.tech AI

Vastus AI-lt

При модификации HashMap во время обхода его элементов (например, при использовании итератора) может возникнуть исключение ConcurrentModificationException. Это происходит потому, что внутренний механизм итератора фиксирует состояние коллекции при создании и при обнаружении изменений (кроме тех, что сделаны через сам итератор) выбрасывает исключение.

Проблемы, которые могут возникнуть:

  • Нарушение целостности данных при одновременном изменении.
  • Исключение ConcurrentModificationException, прерывающее выполнение программы.

Чтобы избежать этого, можно:

  • Использовать итератор и его метод remove() для удаления элементов.
  • Копировать ключи или значения в отдельную коллекцию и обходить её.
  • Использовать ConcurrentHashMap, который поддерживает безопасную модификацию во время обхода.

Пример безопасного удаления элементов из HashMap во время обхода:

Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
    Map.Entry<String, Integer> entry = iterator.next();
    if (entry.getValue() < 0) {
        iterator.remove(); // безопасное удаление
    }
}