TreeMap 和 TreeSet 是 Java Collections API的两个重要成员,其中 TreeMap 是 Map 接口的常用实现类,而 TreeSet 是 Set 接口的常用实现类。
虽然 TreeMap 和TreeSet 实现的接口规范不同,但 TreeSet 底层是通过 TreeMap 来实现的(如同HashSet底层是通过HashMap来实现的一样。与HashSet完全类似,TreeSet里面绝大部分方法都是直接调用TreeMap方法来实现的。),因此二者的实现方式完全一样。
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中可以存在(仅仅Value可以重复)。
-
- TreeMap的底层采用红黑树数据结构实现,完成数据的有序插入。
TreeSet要求存放的对象所属的类必须实现Comparable接口,该接口提供了比较元素的compareTo()方法,当插入元素时会调用该方法比较元素的大小。
TreeMap要求存放的键值对映射的键必须实现Comparable接口从而根据键对元素进行排序。
Collections工具类的sort方法有两种重载的形式:
第一种要求传入的待排序容器中存放的对象所属的类必须实现Comparable接口以实现元素的比较。
第二种不强制要求容器中存放的对象所属的类必须实现Comparable接口,但是要求传入第二个参数,这个参数是Comparator接口的子类型(需要重写compare方法实现元素的比较),相当于一个临时定义的排序规则,其实就是通过接口注入比较元素大小的算法,也是对回调模式的应用(Java中对函数式编程的支持)。