TreeMap 和 TreeSet 是 Java Collection Framework 的两个重要成员。其中TreeMap 是 Map 接口的常用实现类,而 TreeSet 是 Set 接口的常用实现类。虽然 TreeMap 和 TreeSet 实现的接口规范不同,但 TreeSet 底层是通过TreeMap 来实现的(如同 HashSet 底层是是通过 HashMap 来实现的一样),因此二者的实现方式完全一样。而 TreeMap的实现就是红黑树算法。
与HashSet完全类似,TreeSet里面绝大部分方法都是直接调用TreeMap 方法来实现的。
相同点:
TreeMap 和 TreeSet 都是有序的集合,也就是说他们存储的值都是排好序的。TreeMap 和TreeSet 都是非同步集合,因此他们不能在多线程之间共享,不过可以使用方法 Collections.synchroinzedMap()来实现同步
运行速度都要比 Hash 集合慢,他们内部对元素的操作时间复杂度为 O(logN),而 HashMap/HashSet 则为O(1)。
不同点:
最主要的区别就是 TreeSet 和 TreeMap 分别实现 Set 和Map 接口
TreeSet 只存储一个对象,而 TreeMap 存储两个对象 Key 和Value (仅仅 key对象有序)
TreeSet 中不能有重复对象,而 TreeMap 中可以存在
TreeMap 的底层采用红黑树的实现,完成数据有序的插入,排序。
红黑树的特点:
1、每个节点要么是红色,要么是黑色。
2、根节点永远是黑色的。
3、所有的叶节点都是空节点(即 null),并且是黑色的。
4、每个红色节点的两个子节点都是黑色。(从每个叶子到根的路径上不会有两个连续的红色节点)
5、从任一节点到其子树中每个叶子节点的路径都包含相同数量的黑色节点。
TreeSet 要求存放的对象所属的类必须实现Comparable 接口,该接口提供了比较元素的 compareTo()方法,当插入元素时会回调该方法比较元素的大小,
TreeMap要求存放的键值对映射的键必须实现Comparable接口从而根据键对元素进行排序。
Collections 工具类的 sort 方法有两种重载的形式
第一种要求传入的待排序容器中存放的对象比较实现 Comparable 接口以实现元素的比较;
第二种不强制性的要求容器中的元素必须可比较,但是要求传入第二个参数,参数是 Comparator 接口的子类型(需要重写 compare 方法实现元素的比较),相当于一个临时定义的排序规则,其实就是通过接口注入比较元素大小的算法。
也是对回调模式的应用(Java 中对函数式编程的支持)。
Was this helpful?
0 / 0