Когда java TreeMap выполняет сортировку?

#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 /…