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;
    }
}
原文地址:https://www.cnblogs.com/zhengwenqiang/p/8067948.html