Внутренняя работа Java Collections Framework

У меня был этот вопрос в течение очень очень долгого времени.

Вопрос немного длинноват. Пожалуйста, потерпите меня :)

В заключение, как структура данных коллекции, такая как TreeSet, узнает, когда базовые данные, которые она хранит, изменяются, и как она управляет такими случаями??

Пример

//Simple person class with name data member
public static class Person {
    String name;

    public Person(String name) {
        this.name = name;
    }
}


1. Создайте TreeSet и добавьте 3 экземпляра Person p1, p2, p3. (Компаратор сортирует имя).

TreeSet<Person> set = new TreeSet<>(new Comparator<Person>() {
    @Override
    public int compare(Person person1, Person person2) {
        return person1.name.compareTo(person2.name);
    }
});

// Creating 3 Person instances and adding to set.
Person p1 = new Person("Zach"),
        p2 = new Person("Henry"),
        p3 = new Person("Adam");

// Adding to set
set.add(p1);  set.add(p2);  set.add(p3);


2. Печать первого элемента (печатает наименьшую лексикографическую строку в сбалансированном BST)

// This will name of P3 instance, i.e. Adam (obvious and expected) 
System.out.println(set.first().name);
// "Adam" is printed which is expected.


3. Изменение экземпляра Person P3, чтобы он имел имя «зебра». то есть Адам -> Зебра

p3.name = "Zebra";

System.out.println(set.first().name);


ВОПРОС
В разделе 3 я изменил экземпляр p3, чтобы он содержал "Зебру" вместо "Адам".
Вопрос в том, как TreeSet узнал, что экземпляр P3 был изменен???

TreeSet построен с использованием сбалансированного BST (обычно это деревья RB). Следовательно, когда я изменяю некоторые данные, он должен переупорядочивать внутренние узлы дерева, чтобы поддерживать соблюдение правил компаратора.
Итак, как TreeSet получил уведомление о том, что базовые данные были изменены и что он должен снова переупорядочить узлы дерева???

Я действительно хочу знать, как это работает внутри. Это шаблон наблюдателя? Запрашиваю развернутые и исчерпывающие ответы :)


person Adithya Upadhya    schedule 03.09.2017    source источник
comment
Вы смотрели исходный код? Он легко доступен и его легко найти — не там ли вы должны искать его в первую очередь?   -  person Hovercraft Full Of Eels    schedule 03.09.2017
comment
Я провел ваш тест, и он НЕ печатает Генри. Он печатает Zebra, как я и ожидал. Просто запустив собственный тест, вы бы получили ответ: он не знает об изменениях, а изменить состояние объекта после того, как он был сохранен в наборе, — большая проблема.   -  person JB Nizet    schedule 03.09.2017
comment
Сколько исследований ожидается от пользователей Stack Overflow ? Ответ: Много. Абсурдная сумма. Больше, чем вы думаете, на что вы способны. После того, как вы достигли конца своей веревки и боль от отсутствия ответа превышает огромное количество позора, полученного за публикацию вашего вопроса, тогда вы можете пойти дальше и спросить. Просмотр источника занял бы меньше времени, чем написание этого вопроса!   -  person    schedule 03.09.2017
comment
Ребята, мне очень жаль, что я разместил неправильный вопрос с неправильным содержанием. Я помню, как тестировал аналогичный код и обнаружил аналогичную аномалию. Будьте уверены: в следующий раз я буду намного осторожнее. Спасибо за ваши усилия и предложения :) Я заслуживаю отрицательных голосов и принимаю их со смирением.   -  person Adithya Upadhya    schedule 03.09.2017


Ответы (1)


Как структура данных коллекции, такая как TreeMap, узнает, когда базовые данные, которые она хранит, изменяются, и как она справляется с такими случаями?

Это не так. Для значений это не имеет значения, но если вы измените ключи, это может повредить всю коллекцию. Вот почему вы должны предпочесть неизменяемые ключи для карт или, по крайней мере, убедиться, что они не изменены после использования в качестве ключей.

Также обратите внимание, что TreeSet поддерживается TreeMap, а HashSet поддерживается HashMap, поэтому с ними то же самое (с установленными значениями, являющимися ключами карты).

person Kayaman    schedule 03.09.2017
comment
В вопросе были опечатки. Это TreeSet, а не TreeMap... - person Adithya Upadhya; 03.09.2017
comment
@oathkeeper a TreeSet — это TreeMap, где значение всех записей всегда одинаково. - person JB Nizet; 03.09.2017