【JDK1.8】JDK1.8集合源码阅读——TreeMap(一)

目录

一、前言
二、TreeMap的继承关系
三、SortedMap接口源码解析
3.1 SortedMap接口
3.2 Comparable接口
3.3 Comparator接口
四、NavigableMap接口源码解析
五、总结

一、前言

在前面两篇随笔中,我们提到过,当HashMap的桶过大的时候,会自动将链表转化成红黑树结构,当时一笔带过,因为我们将留在本章中,针对TreeMap进行详细的了解。


二、TreeMap的继承关系

下面先让我们来看一下TreeMap的继承关系,对它有一个大致的了解:

【JDK1.8】JDK1.8集合源码阅读——TreeMap(一)

可以看到,除了在之前HashMap里常见的继承类和接口以外,TreeMap实现了NavigableMap接口,而NavigableMap继承自SortedMap,由名字可以看出,只是一个用来实现排序的接口。而这也是为什么TreeMap能够实现排序的原因。由于篇幅关系,将TreeMap的源码解析分为三部分,本章将对接口NavigableMap以及SortedMap进行解析。


三、SortedMap接口源码解析

3.1 SortedMap接口

SortedMap的接口比较简单,没有很特别的地方,唯一比较特别的就是返回Comparator这个接口,可以设想实现排序功能的秘密或许就藏在此处。下面让我们来看一下Comparator和Comparable接口,两者之间有点关联,可以理解为Comparable自带了比较功能,而Comparator是赋予没有比较能力的对象一种比较能力。举个简单例子:面对一道计算题,小明天生口算能力很强,看一眼就能算出来答案。而小李没有这种能力,需要借助计算器才能得出答案。


3.2 Comparable接口

先让我们看下它的代码:

对,就是这么简单,里面传入一个泛型T的对象o,对o进行比较。如果小于o,返回负数;等于o,返回0;大于o返回正数。

我们熟悉的很多对象如,,等都实现了这个接口。可以来看一下简单的例子:

上述main函数的输出:

上面的例子中,我们自己实现了Comparable接口,比较了Item的name属性,然后通过Collections.sort对它进行了排序(值得注意的是:没有实现Comparable接口的对象不能使用该方法)。但是,如果我不想用name属性对它进行排序,想对price进行排序呢,或者先对name排序,相同的话在对price进行排序呢,用这个不就没法实现了吗。这就需要提到了下面的接口


3.3 Comparator接口

照例先来看一下代码:

一起来看一下如何使用,先来看一下JDK1.8以前的用法:

上述main函数的输出是:

JDK1.8以前的用法要自己手动实现Comparator接口,然后调用,传入实现类来完成排序,非常麻烦,而JDK1.8则相对来说简单了很多:

甚至,我们可以不使用Collections.sort:

上述main函数的输出:


四、NavigableMap接口源码解析


注意:上述返回的map与原map是相互影响的。


五、总结

本章分析了TreeMap的继承关系,给后面分析TreeMap作为铺垫。SortedMap和NavigableMap的接口中,包含了大量的返回Map的方法,这也是作为排序Map的一大特点吧。最后谢谢各位园友观看,与大家共同进步!