У меня был этот вопрос в течение очень очень долгого времени.
Вопрос немного длинноват. Пожалуйста, потерпите меня :)
В заключение, как структура данных коллекции, такая как 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 получил уведомление о том, что базовые данные были изменены и что он должен снова переупорядочить узлы дерева???
Я действительно хочу знать, как это работает внутри. Это шаблон наблюдателя? Запрашиваю развернутые и исчерпывающие ответы :)