Java的TreeMap底层实现原理?( 二 )

输出结果:
热词排行榜:#1 HotWord(word=淘宝崩了, count=95)#2 HotWord(word=闲鱼崩了, count=90)#3 HotWord(word=闲鱼崩了, count=85)#4 HotWord(word=钉钉崩了, count=80)类属性看一下TreeMap的类属性 , 包含哪些字段?
public class TreeMap<K, V>        extends AbstractMap<K, V>        implements NavigableMap<K, V>, Cloneable, java.io.Serializable {    /**     * 排序方式     */    private final Comparator<? super K> comparator;    /**     * 红黑树根节点     */    private transient Entry<K, V> root;    /**     * 红黑树节点数     */    private transient int size = 0;    /**     * 红黑树的红黑节点表示     */    private static final boolean RED = false;    private static final boolean BLACK = true;    /**     * 红黑树节点对象     */    static final class Entry<K, V> implements Map.Entry<K, V> {        K key;        V value;        Entry<K, V> left;        Entry<K, V> right;        Entry<K, V> parent;        boolean color = BLACK;        /**         * 构造方法         */        Entry(K key, V value, Entry<K, V> parent) {            this.key = key;            this.value = value;            this.parent = parent;        }    }}TreeMap类属性比较简单,包含排序方式comparator、红黑树根节点root、节点个数size等 。自定义了一个红黑树节点类Entry,内部属性包括键值对、左右子树、父节点、红黑标记值等 。
初始化TreeMap常用的初始化方式有下面三个:

  1. 无参初始化,使用默认的排序方式 。
  2. 指定排序方式的初始化
  3. 将普通Map转换为TreeMap,使用默认的排序方式 。
/** * 无参初始化 */Map<Integer, Integer> map1 = new TreeMap<>();/** * 指定排序方式初始化 */Map<Integer, Integer> map2 = new TreeMap<>(new Comparator<Integer>() {    @Override    public int compare(Integer o1, Integer o2) {        return o1.compareTo(o2);    }});/** * 将普通Map转换为TreeMap */Map<Integer, Integer> map3 = new TreeMap<>(new HashMap<>());再看一下对应的源码实现:
/** * 无参初始化 */public TreeMap() {    comparator = null;}/** * 指定排序方式初始化 */public TreeMap(Comparator<? super K> comparator) {    this.comparator = comparator;}/** * 将普通Map转换为TreeMap */public TreeMap(Map<? extends K, ? extends V> m) {    comparator = null;    putAll(m);}方法列表由于TreeMap存储是按照键的顺序排列的,所以还可以进行范围查询,下面举一些示例 。
import java.util.Collections;import java.util.Map;import java.util.TreeMap;/** * @author 一灯架构 * @apiNote TreeMap方法测试 */public class TreeMapTest {    public static void main(String[] args) {        // 1. 创建一个热词排行榜(按热度倒序),key是热度,value是热词内容        TreeMap<Integer, String> rankMap = new TreeMap<>(Collections.reverseorder());        rankMap.put(80, "阿里云崩了");        rankMap.put(100, "淘宝崩了");        rankMap.put(90, "钉钉崩了");        rankMap.put(60, "闲鱼崩了");        rankMap.put(70, "支付宝崩了");        System.out.println("热词排行榜:");        for (Map.Entry<Integer, String> entry : rankMap.entrySet()) {            System.out.println("#" + entry.getKey() + " " + entry.getValue());        }        System.out.println("-----------");        // 2. 获取排行榜的第一个元素        Map.Entry<Integer, String> firstEntry = rankMap.firstEntry();        System.out.println("firstEntry: " + firstEntry);        // 3. 获取排行榜的最后一个元素        Map.Entry<Integer, String> lastEntry = rankMap.lastEntry();        System.out.println("lastEntry: " + lastEntry);        // 4. 获取排行榜的大于指定键的最小元素(由于是倒序排列,所以结果是反的)        Map.Entry<Integer, String> higherEntry = rankMap.higherEntry(70);        System.out.println("higherEntry: " + higherEntry);        // 5. 获取排行榜的小于指定键的最大元素        Map.Entry<Integer, String> lowerEntry = rankMap.lowerEntry(70);        System.out.println("lowerEntry: " + lowerEntry);        // 6. 获取排行榜的大于等于指定键的最小元素        Map.Entry<Integer, String> ceilingEntry = rankMap.ceilingEntry(70);        System.out.println("ceilingEntry: " + ceilingEntry);        // 7. 获取排行榜的小于等于指定键的最大元素        Map.Entry<Integer, String> floorEntry = rankMap.floorEntry(70);        System.out.println("floorEntry: " + floorEntry);    }}


推荐阅读