[Java数据结构和算法] 详解 TreeMap 和 TreeSet
认识 TreeMap 和 TreeSet
TreeMap 和 TreeSet 是Java 中利用红黑树实现的 Map 和 Set。
其实质是一棵近似平衡的二叉搜索树,即在二叉搜索树的基础之上加了颜色以及一些性质。
TreeMap
TreeMap 是以红黑树为底层结构、基于比较的 Map。
若调用构造方法时不指定比较器,系统默认以Key来进行比较;若传入比较器则会根据传入的比较器来进行比较。
需要注意的是,TreeMap 的排序,无论是否提供了自定义比较器,都必须与 equals 方法保持一致。
构造方法
1. 无参构造方法
调用该无参构造方法会创建一个空的 TreeMap ,并且默认以 Key 进行比较。
因此,所有传入 TreeMap 的 Key 必须是可比较的(即实现了 Comparable 或 Comparator接口),否则将会报 ClassCastException 异常。
2. 传入自定义比较器的构造方法
调用该构造方法,必须重写比较方法,系统会根据所传入的比较器来进行比较。
如果传入的比较器为空,则会默认根据 Key 来进行比较(相当于第一种构造方法)。
当然了,所有传入的 Key 也必须是可比较的。
3. 传入 Map 的构造方法
调用此构造方法将会新建一个 TreeMap,并且将传入的 Map 中的元素全部放入新建的 TreeMap 当中。
所有传入的 Key 必须实现 Comparable接口。
4. 传入一个带比较器的 Map 的构造方法
将传入的 Map 中的元素全部放入新建的 TreeMap 中,并且使用 Map 中的比较器进行比较。
TreeSet
TreeSet 只存储 Key,是一种纯Key 模型。它的底层其实是 TreeMap,结构也是二叉搜索树。
构造方法
1. 无参构造方法
由于 TreeSet 的底层是 TreeMap(前面文章已讲过),因此,TreeSet 的底层结构也是二叉搜索树,也就意味着放入 TreeSet 中的元素必须是可比较的(即实现了 Comparable接口的)。
2. 传入一个自定义比较器的构造方法
如果调用此构造方法,必须重写比较方法。
根据传入的比较器,来进行元素间的比较。
如果传入的比较器为空,则会根据默认方式来进行比较(相当于第一种构造方法)。
3. 传入一个集合的构造方法
会创建一个含有传入集合的所有元素的新集合。
若传入的集合为空,则会报 NullPointerException 错误。
4. 传入一个带比较器的集合的构造方法
将会创建一个含有传入的集合所有元素的新集合,并且以传入集合的比较器来进行元素间的比较。
完