TreeMap集合解析

1、TreeMap是一个支持排序的Map实现。要求其key实现Comparable接口或者创建自身时传入Comparable接口实现。

内部Entry对象:
    static final class Entry<K,V> implements Map.Entry<K,V> {
K key;
        V value;
        Entry<K,V> left = null;
        Entry<K,V> right = null;
        Entry<K,V> parent;
        boolean color = BLACK;

        /**
         * Make a new cell with given key, value, and parent, and with
         * <tt>null</tt> child links, and BLACK color.
         */
        Entry(K key, V value, Entry<K,V> parent) {
            this.key = key;
            this.value = value;
            this.parent = parent;

        }

2、put(key,value):先判断root是否为null,如果是,则创建衣蛾新的Entry对象赋值给root。如果root不为null,如果传入comparator对象,则基于红黑树方式遍历,小于root key的放左边,大于放右边,相等替换value,没有相等的一致找到左边或右边节点为null的元素;创建Entry节点。如果没有传递comparator对象,则用key对象的comparator方法比较。

   public V put(K key, V value) {
        Entry<K,V> t = root;
        if (t == null) {
    // TBD:
    // 5045147: (coll) Adding null to an empty TreeSet should
    // throw NullPointerException
    //
    // compare(key, key); // type check
            root = new Entry<K,V>(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();
            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<K,V>(key, value, parent);
        if (cmp < 0)
            parent.left = e;
        else
            parent.right = e;
        fixAfterInsertion(e);
        size++;
        modCount++;
        return null;
    }

详细参考https://www.cnblogs.com/skywang12345/p/3310928.html

猜你喜欢

转载自blog.csdn.net/dhfzhishi/article/details/80984038
今日推荐