TreeMap的实现原理

2020-12-29  本文已影响0人  贼噶人

实现是通过红黑二叉树来实现的,这个看他的Entry的数据结构就可以体现出来。

 static final class Entry<K, V> implements java.util.Map.Entry<K, V> {
        K key;
        V value;
        TreeMap.Entry<K, V> left;
        TreeMap.Entry<K, V> right;
        TreeMap.Entry<K, V> parent;
        boolean color = true;

        Entry(K var1, V var2, TreeMap.Entry<K, V> var3) {
            this.key = var1;
            this.value = var2;
            this.parent = var3;
        }

在插入K,V时他会根据红黑树的特性,根据compare方法返回的值在left,right中遍历找到对应的位置插入Entry或替换V。

public V put(K var1, V var2) {
        TreeMap.Entry var3 = this.root;
        if (var3 == null) {
            this.compare(var1, var1);
            this.root = new TreeMap.Entry(var1, var2, (TreeMap.Entry)null);
            this.size = 1;
            ++this.modCount;
            return null;
        } else {
            Comparator var6 = this.comparator;
            int var4;
            TreeMap.Entry var5;
            if (var6 != null) {
                 //根据Comparator的比较结果在红黑树中确定Key的位置插入或者替换Value
                do {
                    var5 = var3;
                    var4 = var6.compare(var1, var3.key);
                    if (var4 < 0) {
                        var3 = var3.left;
                    } else {
                        if (var4 <= 0) {
                            return var3.setValue(var2);
                        }
                        var3 = var3.right;
                    }
                } while(var3 != null);
            } else {
                   //这里是Key实现了Comparable接口,在红黑树中确定Key的位置插入或者替换Value
                if (var1 == null) {
                    throw new NullPointerException();
                }

                Comparable var7 = (Comparable)var1;

                do {
                    var5 = var3;
                    var4 = var7.compareTo(var3.key);
                    if (var4 < 0) {
                        var3 = var3.left;
                    } else {
                        if (var4 <= 0) {
                            return var3.setValue(var2);
                        }

                        var3 = var3.right;
                    }
                } while(var3 != null);
            }
           //后面是插入元素后可能导致红黑树不自平衡,重新是红黑树平衡
            TreeMap.Entry var8 = new TreeMap.Entry(var1, var2, var5);
            if (var4 < 0) {
                var5.left = var8;
            } else {
                var5.right = var8;
            }
      
            this.fixAfterInsertion(var8);
            ++this.size;
            ++this.modCount;
            return null;
        }
    }

TreeSet 是根据TreeMap来实现的,直接看他的构造函数就可以只知道

,他的Set性质是通过Map的Key唯一来实现的。

public TreeSet() {
        this((NavigableMap)(new TreeMap()));
    }

    public TreeSet(Comparator<? super E> var1) {
        this((NavigableMap)(new TreeMap(var1)));
    }

    public TreeSet(Collection<? extends E> var1) {
        this();
        this.addAll(var1);
    }

// 添加元素的方法是通过,把元素通过Map的Key的方式添加进map中
  public boolean add(E var1) {
        return this.m.put(var1, PRESENT) == null;
    }
上一篇 下一篇

猜你喜欢

热点阅读