构造方法

public TreeMap() {comparator = null;
}/*** 使用传入的comparator比较两个key的大小*/
public TreeMap(Comparator<? super K> comparator) {this.comparator = comparator;
}/*** key必须实现Comparable接口,把传入map中的所有元素保存到新的TreeMap中*/
public TreeMap(Map<? extends K, ? extends V> m) {comparator = null;putAll(m);
}/*** 使用传入map的比较器,并把传入map中的所有元素保存到新的TreeMap中*/
public TreeMap(SortedMap<K, ? extends V> m) {comparator = m.comparator();try {buildFromSorted(m.size(), m.entrySet().iterator(), null, null);} catch (java.io.IOException cannotHappen) {} catch (ClassNotFoundException cannotHappen) {}
}

获取元素

public V get(Object key) {// 根据key查找元素Entry<K,V> p = getEntry(key);// 找到了返回value值,没找到返回nullreturn (p==null ? null : p.value);
}final Entry<K,V> getEntry(Object key) {// 如果comparator不为空,使用comparator的版本获取元素if (comparator != null)return getEntryUsingComparator(key);// 如果key为空返回空指针异常if (key == null)throw new NullPointerException();// 将key强转为Comparable@SuppressWarnings("unchecked")Comparable<? super K> k = (Comparable<? super K>) key;// 从根元素开始遍历Entry<K,V> p = root;while (p != null) {int cmp = k.compareTo(p.key);if (cmp < 0)// 如果小于0从左子树查找p = p.left;else if (cmp > 0)// 如果大于0从右子树查找p = p.right;else// 如果相等说明找到了直接返回return p;}// 没找到返回nullreturn null;
}final Entry<K,V> getEntryUsingComparator(Object key) {@SuppressWarnings("unchecked")K k = (K) key;Comparator<? super K> cpr = comparator;if (cpr != null) {// 从根元素开始遍历Entry<K,V> p = root;while (p != null) {int cmp = cpr.compare(k, p.key);if (cmp < 0)// 如果小于0从左子树查找p = p.left;else if (cmp > 0)// 如果大于0从右子树查找p = p.right;else// 如果相等说明找到了直接返回return p;}}// 没找到返回nullreturn null;
}

插入元素

public V put(K key, V value) {Entry<K,V> t = root;if (t == null) {// 如果没有根节点,直接插入到根节点compare(key, key); // type (and possibly null) checkroot = new Entry<>(key, value, null);size = 1;modCount++;return null;}// key比较的结果int cmp;// 用来寻找待插入节点的父节点Entry<K,V> parent;// 根据是否有comparator使用不同的分支Comparator<? super K> cpr = comparator;if (cpr != null) {// 如果使用的是comparator方式,key值可以为null,只要在comparator.compare()中允许即可// 从根节点开始遍历寻找do {parent = t;cmp = cpr.compare(key, t.key);if (cmp < 0)// 如果小于0从左子树寻找t = t.left;else if (cmp > 0)// 如果大于0从右子树寻找t = t.right;else// 如果等于0,说明插入的节点已经存在了,直接更换其value值并返回旧值return t.setValue(value);} while (t != null);}else {// 如果使用的是Comparable方式,key不能为nullif (key == null)throw new NullPointerException();@SuppressWarnings("unchecked")Comparable<? super K> k = (Comparable<? super K>) key;// 从根节点开始遍历寻找do {parent = t;cmp = k.compareTo(t.key);if (cmp < 0)// 如果小于0从左子树寻找t = t.left;else if (cmp > 0)// 如果大于0从右子树寻找t = t.right;else// 如果等于0,说明插入的节点已经存在了,直接更换其value值并返回旧值return t.setValue(value);} while (t != null);}// 如果没找到,那么新建一个节点,并插入到树中Entry<K,V> e = new Entry<>(key, value, parent);if (cmp < 0)// 如果小于0插入到左子节点parent.left = e;else// 如果大于0插入到右子节点parent.right = e;// 插入之后的平衡fixAfterInsertion(e);// 元素个数加1(不需要扩容)size++;// 修改次数加1modCount++;// 如果插入了新节点返回空return null;
}

TreeMap方法源码相关推荐

  1. 简单介绍Vue之vue.$set()方法源码案例

    这篇文章主要介绍了Vue之vue.$set()方法源码案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下 在使用vue开发项目的过程中,经常会遇到这样 ...

  2. Transformers包tokenizer.encode()方法源码阅读笔记

    Transformers包tokenizer.encode()方法源码阅读笔记_天才小呵呵的博客-CSDN博客_tokenizer.encode

  3. 【错误记录】Android Studio 中查看 Gradle 配置的方法源码 ( 配置 gradle-wrapper.properties 中版本为 gradle-x.x.x-all.zip )

    文章目录 一.报错信息 二.解决方案 Android Plugin DSL Reference 参考文档 : https://google.github.io/android-gradle-dsl/2 ...

  4. 【Android 异步操作】线程池 ( 线程池 execute 方法源码解析 )

    文章目录 一.线程池 execute 方法源码解析 二.线程池 execute 方法完整源码及注释 一.线程池 execute 方法源码解析 进入 ThreadPoolExecutor 中 , 查看线 ...

  5. 中文分词算法python_Python FMM算法的中文分词器实现方法源码

    这是一篇基于Python代码使用FMM算法达到中文分词效果实现方法的文章.中文语句分词因为编码的关系在Python语言中并不是很好处理,关于中文乱码与编码的问题解决方法,可以参考玩蛇网的Python中 ...

  6. 深入java并发包源码(三)AQS独占方法源码分析

    深入java并发包源码(一)简介 深入java并发包源码(二)AQS的介绍与使用 深入java并发包源码(三)AQS独占方法源码分析 AQS 的实现原理 学完用 AQS 自定义一个锁以后,我们可以来看 ...

  7. erlang下lists模块sort(排序)方法源码解析(二)

    上接erlang下lists模块sort(排序)方法源码解析(一),到目前为止,list列表已经被分割成N个列表,而且每个列表的元素是有序的(从大到小) 下面我们重点来看看mergel和rmergel ...

  8. c#equals方法源码_C#中的Int32.Equals()方法示例

    c#equals方法源码 Int32.Equals()方法 (Int32.Equals() Method) This method is used to compare two integer obj ...

  9. php的setinc方法,thinkphp3.2.0 setInc方法 源码全面解析

    搜索热词 我们先来看一下setInc的官方示例: 需要一个字段和一个自增的值(默认为1) 我们通过下面这个例子来一步步分析他的底层是怎么实现的: class TestController extend ...

最新文章

  1. linux文本分析利器awk
  2. 【C#】Gif文件生成
  3. redis value多大会影响性能_redis面试总结
  4. Eureka-服务注册
  5. php 7.1 openssl安装,介绍 php7.1 安装openssl扩展,php openssl
  6. 【转载】这次拆库 应是微服务化的拆分方式
  7. 郑继明等《数值分析》习题解答
  8. JavaWeb的JSP原理,详细解析(建议收藏)
  9. 【九天教您南方cass 9.1】 06 绘制方格网
  10. 定积分数值计算(C++实现)
  11. 《工业设计史》第八章:20世纪20、30年代的流行风格
  12. 世嘉MD游戏开发【十】:精灵动画,Sprite Animation
  13. fcitx-configtool
  14. win10 网络重置
  15. 通过谷歌Google轻松拥有自己的站内搜索代码
  16. 莫甘娜的盾可以挡机器人_莫甘娜黑盾到底有多强,不仅可以免疫魔法伤害,这些技能都能免疫...
  17. 二手交易app manifest.xml
  18. 数据结构与算法之链表结构寻找p、q最近的公共祖先
  19. java版我的世界_我的世界Java版1.16
  20. 【ParaView教程】第四章 常见问题 —— 怎样用ParaView导入Star CCM+的结果?

热门文章

  1. ElasticSearch 性能优化实战,让你的 ES 飞起来!
  2. 打造杰出软件开发团队的12条指导建议
  3. STL中算法锦集(一)
  4. 音视频技术开发周刊 | 227
  5. 关于语音发送/接收 方法和装置发明专利正式发布
  6. 【大会】技术决策背后的商业逻辑
  7. 李备:期待移动端非线性自适应滤波器
  8. 腾讯初探AI+农业 获国际AI温室种植大赛亚军
  9. 讲述CCF-腾讯犀牛鸟基金项目成长故事
  10. debian9 没有ipv4