zoukankan      html  css  js  c++  java
  • TreeMap源码

    一、TreeMap简介

    TreeMap是基于红黑树的java版实现,作者Josh Bloch and Doug Lea(这二人在java发展的早期做了重大贡献,比如集合框架JDK1.2、并发包JDK1.5)

    TreeMap使用了比较排序来维护元素大小顺序

    二、排序方式

    1.TreeMap排序方式  

    这个map的keys的排序要让元素实现接口Comparable从而自然排序 或者在实例化map时向构造方法传入一个Comparator从而定制排序

    2.自然排序

    元素实现Comparable接口。将POJO类和比较方法compareTo(Object obj)写在一个类中

    3.定制排序

    自定义Comparator接口的实现类,作为比较元素大小的比较器。将比较方法compare(e1,e2)写在单独的类中。

    4.与equals关系

    对元素大小排序时,compareTo (E e)、compare(E e1,E e2) 这两个方法的比较结果要与equals在逻辑上一致,避免在使用HashMap时产生冲突。

    三、源码解读

    public class TreeMap<K,V>
        extends AbstractMap<K,V>
        implements NavigableMap<K,V>, Cloneable, java.io.Serializable
    {
        /**
         * 这个比较器用来维护treeMap的顺序,当自然排序时可以为null
         */
        private final Comparator<? super K> comparator;
    
        private transient Entry<K,V> root = null;
    
        /**
         * tree中entries的数量
         */
        private transient int size = 0;
    
        /**
         * 对tree进行结构化修改的次数
         */
        private transient int modCount = 0;
    
        /**
         使用自然排序来构建一个新的、空参的treeMap,所有被插入的keys必须实现Comparable接口,
         必须是可以互相比较的,使用compareTo不能抛出ClassCastException.
         如果用户放入一个违法约束的key,这个类的put方法将会抛出ClassCastException异常。
         */
        public TreeMap() {
            comparator = null;
        }
    
        /**
         * 使用定制排序来构建一个新的、空参的treeMap,keys用给定的comparator时必须是可以比较的,
          不能抛出ClassCastException.如果用户放入一个违法约束的key,这个类的put方法将会抛出ClassCastException异常。
          参数comparator如果为null,还是会使用自然排序
    
         */
        public TreeMap(Comparator<? super K> comparator) {
            this.comparator = comparator;
        }
    }
  • 相关阅读:
    C++的开源跨平台日志库glog学习研究(一)
    C++实现的字符串模糊匹配
    Git&GitHub学习日志
    UTF-8和GBK等中文字符编码格式介绍及相互转换
    HDU
    340. 通信线路(分层图最短路)
    ACwing 你能回答这些问题吗(线段树求最大连续字段和)
    Laptop(线段树+离散化)
    Infinite Inversions(树状数组+离散化)
    HDU-4417-Super Mario(主席树解法)
  • 原文地址:https://www.cnblogs.com/zhengwenqiang/p/8067948.html
Copyright © 2011-2022 走看看