类似于HashMap和HashSet之间的关系,HashSet底层依赖于HashMap实现,TreeSet底层则采用一个NavigableMap来保存TreeSet集合的元素。但实际上,由于NavigableMap只是一个接口,因此底层依然是使用TreeMap来包含Set集合中的所有元素

下面是TreeSet类的部分源代码

  1. public class TreeSet<E> extends AbstractSet<E>
  2. implements NavigableSet<E>, Cloneable, java.io.Serializable
  3. {
  4. // 使用NavigableMap的key来保存Set集合的元素
  5. private transient NavigableMap<E,Object> m;
  6. // 使用一个PRESENT作为Map集合的所有value
  7. private static final Object PRESENT = new Object();
  8. // 包访问权限的构造器,以指定的NavigableMap对象创建Set集合
  9. TreeSet(NavigableMap<E,Object> m) {
  10. this.m = m;马士兵
  11. }
  12. public TreeSet() { // ①
  13. // 以自然顺序方式创建一个新的TreeMap,根据该TreeSet创建一个TreeSet
  14. this(new TreeMap<E,Object>());
  15. }
  16. public TreeSet(Comparator<? super E> comparator) { // ②
  17. // 以定制顺序方式创建一个新的TreeMap,根据该TreeSet创建一个TreeSet
  18. // 使用该TreeMap的key来保存Set集合的元素
  19. this(new TreeMap<E,Object>(comparator));
  20. }
  21. public TreeSet(Collection<? extends E> c) {
  22. // 调用①号构造器创建一个TreeSet,底层以TreeMap保存集合元素
  23. this();
  24. // 向TreeSet中添加Collection集合c里的所有元素
  25. addAll(c);
  26. }
  27. public TreeSet(SortedSet<E> s) {
  28. // 调用②号构造器创建衣蛾TreeSet,底层以TreeMap保存集合元素
  29. this(s.comparator());
  30. // 向TreeSet中添加SortedSet集合s里的所有元素
  31. addAll(s);
  32. }
  33. public boolean addAll(Collection<? extends E> c) {
  34. // Use linear-time version if applicable
  35. if (m.size()==0 && c.size() > 0 &&
  36. c instanceof SortedSet &&
  37. m instanceof TreeMap) {
  38. // 把c集合强制转换为SortedSet集合
  39. SortedSet<? extends E> set = (SortedSet<? extends E>) c;
  40. // 把m集合强制转换为TreeMap集合
  41. TreeMap<E,Object> map = (TreeMap<E, Object>) m;
  42. Comparator<? super E> cc = (Comparator<? super E>) set.comparator();
  43. Comparator<? super E> mc = map.comparator();
  44. // 如果cc和mc两个Comparator相等
  45. if (cc==mc || (cc != null && cc.equals(mc))) {
  46. // 把Collection中所有元素添加成TreeMap集合的key
  47. map.addAllForTreeSet(set, PRESENT);
  48. return true;
  49. }
  50. }
  51. // 直接调用父类的addAll()方法来实现
  52. return super.addAll(c);
  53. }
  54. }

从上面代码可以看出,TreeSet的①号、②号构造器都是新建一个TreeMap作为实际存储Set元素的容器,而另外2个构造器则分别依赖于①号和②号构造器。由此可见,TreeSet底层实际使用的存储容器就是TreeMap。

与HashSet完全类似的是,TreeSet里绝大部分方法都是直接调用TreeMap的方法来实现的。

TreeSet实现原理及源码分析的更多相关文章

  1. OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波

    http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 201 ...

  2. ConcurrentHashMap实现原理及源码分析

    ConcurrentHashMap实现原理 ConcurrentHashMap源码分析 总结 ConcurrentHashMap是Java并发包中提供的一个线程安全且高效的HashMap实现(若对Ha ...

  3. HashMap和ConcurrentHashMap实现原理及源码分析

    HashMap实现原理及源码分析 哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表, ...

  4. (转)ReentrantLock实现原理及源码分析

    背景:ReetrantLock底层是基于AQS实现的(CAS+CHL),有公平和非公平两种区别. 这种底层机制,很有必要通过跟踪源码来进行分析. 参考 ReentrantLock实现原理及源码分析 源 ...

  5. 【转】HashMap实现原理及源码分析

    哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景极其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,而HashMap的实现原理也常常出 ...

  6. 【OpenCV】SIFT原理与源码分析:DoG尺度空间构造

    原文地址:http://blog.csdn.net/xiaowei_cqu/article/details/8067881 尺度空间理论   自然界中的物体随着观测尺度不同有不同的表现形态.例如我们形 ...

  7. 《深入探索Netty原理及源码分析》文集小结

    <深入探索Netty原理及源码分析>文集小结 https://www.jianshu.com/p/239a196152de

  8. HashMap实现原理及源码分析之JDK8

    继续上回HashMap的学习 HashMap实现原理及源码分析之JDK7 转载 Java8源码-HashMap  基于JDK8的HashMap源码解析  [jdk1.8]HashMap源码分析 一.H ...

  9. 【OpenCV】SIFT原理与源码分析:关键点描述

    <SIFT原理与源码分析>系列文章索引:http://www.cnblogs.com/tianyalu/p/5467813.html 由前一篇<方向赋值>,为找到的关键点即SI ...

随机推荐

  1. Linux下的Nginx安装

    1 nginx安装环境 nginx是C语言开发,建议在linux上运行,本教程使用Centos6.5作为安装环境. gcc 安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有g ...

  2. linux下挂载ISO像镜文件

    挂载命令(mount) 命令格式:mount [-t vfstype] [-o options] device dir其中:1.-t vfstype 指定文件系统的类型,通常不必指定.mount 会自 ...

  3. AccessToken-->Password Grant

    https://www.oauth.com/oauth2-servers/access-tokens/password-grant/ The Password grant is used when t ...

  4. 算数基本定理 - nefu 118

    算数基本定理 每个大于1的正整数都可以被唯一分解为素数的成绩,在乘积中的素因子按照非降序排列 a = p1^a1 * p2^a2 * ... pn^an; b = p1^b1 * p2^b2 * .. ...

  5. gdb 调试coredump文件过程:

    第一步:首先需要一个进程的coredump文件,怎么搞出coredump文件呢? 1. ps -fax|grep                 进程名称 找到进程的pid 2.gdb -p pid ...

  6. 关于Spring Test 小结

    1.>public class CustomerPackagePrealertControllerTest  extends WebSpringBaseTest{} 2.> @WebApp ...

  7. linux 用 grep 查找单个或多个字符串(关键字)

    1.单个 cat /tmp/php.log | grep "成功" 所有的成功都会被查询出来. 2.多个,并列查询 cat /tmp/php.log | grep "推荐 ...

  8. 【Python】模块学习之ConfigParser读写配置信息

    前言 使用配置文件可以在不修改程序的情况下,做到对程序功能的定制.Python 使用自带的configParser模块可以很方便的读写配置文件的信息. configParser 支持的方法 Confi ...

  9. MySQL安装的N种方式

    一.二进制包安装 1.)下载:在官网的下载页面下的服务器操作系统选择  Linux- Generic : 进制分发版的格式是:mysql-<版本>-<OS>-tar.gz 2. ...

  10. Weex了解

    weex描述 weex是一个使用web开发体验来开发高性能原生应用的框架,能支持vue.js框架.它可以实现用同一套代码来构建Andriod.IOS和web应用.可以实现使用JavaScript和流行 ...