#java #collections
#java #Коллекции
Вопрос:
Кто-нибудь может сказать, когда TeeMap производит сортировку — при добавлении записей с помощью метода put или, например, перед итерацией карты? Я пытался найти в javadoc, но безуспешно.
Комментарии:
1. Древовидная карта всегда будет отсортирована, поэтому это должно происходить при добавлении / удалении элементов. Javadoc для самого класса уже намекает на это: «Эта реализация обеспечивает гарантированную стоимость времени регистрации (n) для операций containsKey, get, put и remove» — стоимость этих методов связана с необходимостью поиска элемента (либо того, который вы ищете, либо того, который нужно вставить до или после).
2. Что именно вы пытаетесь выяснить? С точки зрения разработчика эта коллекция всегда упорядочена.
Ответ №1:
Это делается во время операций изменения.
Например, вот реализация метода jdk8 put
:
public V put(K key, V value) {
Entry<K,V> t = root;
if (t == null) {
compare(key, key); // type (and possibly null) check
root = new Entry<>(key, value, null);
size = 1;
modCount ;
return null;
}
int cmp;
Entry<K,V> parent;
// split comparator and comparable paths
Comparator<? super K> cpr = comparator;
if (cpr != null) {
do {
parent = t;
cmp = cpr.compare(key, t.key);
if (cmp < 0)
t = t.left;
else if (cmp > 0)
t = t.right;
else
return t.setValue(value);
} while (t != null);
}
else {
if (key == null)
throw new NullPointerException();
@SuppressWarnings("unchecked")
Comparable<? super K> k = (Comparable<? super K>) key;
do {
parent = t;
cmp = k.compareTo(t.key);
if (cmp < 0)
t = t.left;
else if (cmp > 0)
t = t.right;
else
return t.setValue(value);
} while (t != null);
}
Entry<K,V> e = new Entry<>(key, value, parent);
if (cmp < 0)
parent.left = e;
else
parent.right = e;
fixAfterInsertion(e);
size ;
modCount ;
return null;
}
Комментарии:
1. О чем
remove()
?2. Это будет одинаково для всех операций изменения (put / putAll / remove / etc …)
3. Вы можете найти здесь всю реализацию
TreeMap
: hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share /…