浅谈:TreeMap和TreeSet的区别与联系

TreeMap 和 TreeSet 是 Java Collections API的两个重要成员,其中 TreeMap 是 Map 接口的常用实现类,而 TreeSet 是 Set 接口的常用实现类。

虽然 TreeMap 和TreeSet 实现的接口规范不同,但 TreeSet 底层是通过 TreeMap 来实现的(如同HashSet底层是通过HashMap来实现的一样。与HashSet完全类似,TreeSet里面绝大部分方法都是直接调用TreeMap方法来实现的。),因此二者的实现方式完全一样。

TreeMap 的实现就是红黑树数据结构。

相同点:

  1. 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中对函数式编程的支持)。


猜你喜欢

转载自blog.csdn.net/qq_36544360/article/details/80685602