вопрос поведения java.util.TreeMap - PullRequest
1 голос
/ 28 июня 2010

Документы класса утверждают, что Entry s нельзя изменить с помощью .setValue(...), но также предупреждают, что put(...) работает нормально.

Означает ли это, что put(...) будет нормально работать при переборе представлений коллекции, таких как navigableKeySet() (т. Е. Не приведет к ConcurrentModificationException), если не внесены структурные изменения (т. Е. Добавлен новый ключ)

Я нахожусь в процессе его тестирования, но если я не могу прервать итерацию, мне все равно нужна некоторая проверка того, что она работает нормально (вместо того, чтобы я не смог ее разорвать).

Ответы [ 2 ]

2 голосов
/ 28 июня 2010

Я считаю, что вы правы, если вы не вносите структурную модификацию, добавляя новый ключ, вы не рискуете 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.

2 голосов
/ 28 июня 2010

Состояние Javadocs для TreeMap :

Структурной модификацией является любая операция, которая добавляет или удаляет одно или несколько сопоставлений; простое изменение значения, связанного с существующим ключом, не является структурной модификацией.

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

...