设为首页 加入收藏

TOP

3、TreeMap源码解析(一)
2023-07-25 21:43:27 】 浏览:74
Tags:TreeMap 解析

1 TreeMap基本介绍

  • Java TreeMap实现了SortedMap接口,也就是说会按照key的大小顺序对Map中的元素进行排序
  • key大小的评判可以通过其本身的自然顺序(natural ordering),也可以通过构造时传入的比较器(Comparator)。
  • TreeMap底层通过红黑树实现
  • TreeMap是非同步的。可以通过如下方式将TreeMap包装成同步的:SortedMap m = Collections.synchronizedSortedMap(new TreeMap(...));
  • TreeMap 跟 HashMap是两种不同的结构,TreeMap没有使用hash相关概念

2 红黑树数据结构回顾

  1. 每个节点颜色不是黑色,就是红色
  2. 根节点是黑色的
  3. 红色节点不能连续
  4. 对于每个节点,从该节点到其树尾端的简单路径上,均包含相同数目的黑色节点

3 成员变量

    private final Comparator<? super K> comparator;  //排序器,如果空,按照key的字典顺序来排序(升序);comparator为空时用Comparable的排序接口
    private transient Entry<K,V> root; //根节点
    private transient int size = 0; //树中entry个数 ,即红黑树大小
    private transient int modCount = 0;  //数结构被修改的次数的
     /**
     * Fields initialized to contain an instance of the entry set view
     * the first time this view is requested.  Views are stateless, so
     * there's no reason to create more than one.
     */
    private transient EntrySet entrySet;
    private transient KeySet<K> navigableKeySet;
    private transient NavigableMap<K,V> descendingMap;
     /**
     * Dummy value serving as unmatchable fence key for unbounded
     * SubMapIterators
     */
    private static final Object UNBOUNDED = new Object();
    private static final boolean RED   = false; //红节点 默认false
    private static final boolean BLACK = true;  // 黑节点 默认true

4 内部类Entry

它是组成树的节点的类型

    static final class Entry<K,V> implements Map.Entry<K,V> {
        K key;   // key
        V value;  //value
        Entry<K,V> left; //左孩子
        Entry<K,V> right;  //右孩子
        Entry<K,V> parent;  //父节点
        boolean color = BLACK;  //默认黑色

        //根据 key  value 父节点创建新节点
        Entry(K key, V value, Entry<K,V> parent) {
            this.key = key;
            this.value = value;
            this.parent = parent;
        }

        public K getKey() {
            return key;
        }
        public V getValue() {
            return value;
        }

     //替换value,返回旧value
        public V setValue(V value) {
            V oldValue = this.value;
            this.value = value;
            return oldValue;
        }

        // 重写equals方法:key 和 value的引用都相等
        public boolean equals(Object o) {
            if (!(o instanceof Map.Entry))
                return false;
            Map.Entry<?,?> e = (Map.Entry<?,?>)o;

            return valEquals(key,e.getKey()) && valEquals(value,e.getValue());
        }
        
        //重写hashCode方法,返回 key 和 value的hashCode 的异或运算结构
        public int hashCode() {
            int keyHash = (key==null ? 0 : key.hashCode());
            int valueHash = (value==null ? 0 : value.hashCode());
            return keyHash ^ valueHash;
        }

        public String toString() {
            return key + "=" + value;
        }
    }

5 构造函数

    // 构造函数一:不指定排序器。按照key的字典顺序来排序(升序)
    public TreeMap() {
        comparator = null;
    }
    // 构造函数二:指定排序器
     public TreeMap(Comparator<? super K> comparator) {
        this.comparator = comparator;
    }
    //构造函数三:构造并返回跟参数m有相同键值映射结构的treeMap(m变为红黑树)
    public TreeMap(Map<? extends K, ? extends V> m) {
        comparator = null;
        putAll(m);
    }
     //构造函数四:构造并返回跟参数m(有序的)有相同键值映射结构的treeMap
    public TreeMap(SortedMap<K, ? extends V> m) {
        comparator = m.comparator();
        try {
            buildFromSorted(m.size(), m.entrySet().iterator(), null, null);
        } catch (java.io.IOException cannotHappen) {
        } catch (ClassNotFoundException cannotHappen) {
        }
    }

Comparator Integer类型倒序排序

    public static void main(String[] args) {
        TreeMap treeMap = new TreeMap<
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇SSL 证书基本概念扫盲 下一篇2、HashMap源码分析

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目