Ответ
TreeMap — реализация интерфейса SortedMap/NavigableMap, которая не допускает дубликатов ключей. При добавлении пары ключ-значение с ключом, который уже присутствует в мапе, происходит замена (перезапись) значения, связанного с этим ключом, на новое. Размер коллекции (size()) не изменяется.
Механизм работы метода put(K key, V value):
- На основе
Comparator(если задан) или естественного порядка ключей (если ключ реализуетComparable) находится позиция ключа в красно-черном дереве. - Если ключ уже существует, его текущее значение заменяется на новое, и метод возвращает старое значение.
- Если ключ отсутствует, создается новый узел в дереве, размер мапы увеличивается, и метод возвращает
null.
Пример:
TreeMap<String, Integer> scores = new TreeMap<>();
// Первое добавление ключа "Alice"
scores.put("Alice", 100);
System.out.println(scores); // {Alice=100}
System.out.println(scores.size()); // 1
// Попытка добавить элемент с тем же ключом "Alice"
Integer oldValue = scores.put("Alice", 150); // Происходит ПЕРЕЗАПИСЬ
System.out.println("Old value: " + oldValue); // Old value: 100
System.out.println(scores); // {Alice=150} (значение обновлено)
System.out.println(scores.size()); // 1 (размер НЕ изменился)
Критически важные требования к ключам:
- Сравнимость (Comparable/Comparator): Ключи должны быть сравнимы между собой. Если класс ключа не реализует
Comparableи не переданComparatorв конструктор, при вызовеput()будет выброшеноClassCastException. - Консистентность с equals(): Для корректной работы
TreeMapпорядок, заданныйComparator/Comparable, должен быть согласован сequals(). То естьcompare(a, b) == 0должен возвращатьtrueтогда и только тогда, когдаa.equals(b) == true. Стандартные реализации (например,String,Integer) соблюдают это правило.
Альтернатива для хранения нескольких значений на ключ: Если логика приложения требует ассоциировать с одним ключом несколько значений, используйте структуру Map<K, List<V>> или Map<K, Set<V>>.