Я считаю, что вы правы, если вы не вносите структурную модификацию, добавляя новый ключ, вы не рискуете ConcurrentModificationException
.
То есть такой код является законнымпо проекту:
NavigableMap<Integer,String> nmap =
new TreeMap<Integer,String>();
nmap.put(1, "One");
nmap.put(2, "Two");
nmap.put(3, "Three");
nmap.put(4, "Four");
nmap.put(5, "Five");
NavigableSet<Integer> nkeys =
nmap.navigableKeySet().subSet(2, true, 4, true);
for (Integer key : nkeys) {
nmap.put(key, "Blah");
}
System.out.println(nmap);
// prints "{1=One, 2=Blah, 3=Blah, 4=Blah, 5=Five}"
Я также подкрепляю это просмотром исходного кода версии OpenJDK , где modCount++;
выполняется только при добавлении new Entry
.
(В TreeMap
, modCount
- , объявленный как private transiet
, но его аналог в AbstractList
, объявленный protected transient
, и там его предполагаемое использование - * 1020.* задокументировано для подсчета числа структурной модификации с целью обнаружения ConcurrentModificationException
).
Кроме того, документация для TreeMap
явно разъясняетто, что считается структурной модификацией :
Структурной модификацией является любая операция, которая добавляет или удаляет одно или несколько сопоставлений;простое изменение значения, связанного с существующим ключом, не является структурной модификацией
На основании всего вышесказанного я скажу, что да, put
, который не добавляет новую пару ключ / значениене является структурной модификацией и, следовательно, не вызовет ConcurrentModificationException
.