1、概述

TreeMap是Java内部实现比较复杂的集合类之一。与HashMap不一样,TreeMap的底层不是用哈希表实现的,而是用红黑树实现的。另外,HashMap存取元素的时间复杂度是O(1)的常量级,而TreeMap对元素的操作复杂度为O(log n)。虽然在操作性能方面,TreeMap不占优势,但是因为它使用红黑树(平衡二叉查找树)实现,所以它内部的元素都是排好序的。当需要查找的元素是排好序的,TreeMap的优势就体现出来了。

2、红黑树简介

首先,介绍一下红黑树的基本性质。红黑树不是一棵严格意义上的平衡树,因为它的高度差会大于1。了解一下它的性质就清楚了。

红黑树是一棵二叉树,它满足以下5个特性:

<1>每个节点的颜色是红色或黑色。

<2>根节点必须是黑色的。

<3>每个叶节点是黑色的(叶节点是指树尾端的NULL节点)。

<4>如果一个节点是红色的,那么它的子节点必须是黑色。即,不能有连续的红色节点。

<5>对于任意一个节点,从它到叶节点的每条路径包含相同数量的黑色节点。

由上述定义可知,红黑树是一棵相对平衡的二叉查找树。因为红黑树天生需要平衡,所以就可以避免一般的二叉查找树在极端情况(插入的数据已经排好序)失去平衡的情况。

3、TreeMap的Entry类

由于TreeMap包含了tree和Map的性质,它所包含的的Entry类应该有以下6个成员变量:

左子结点引用、右子节点引用、父节点引用、key、value、color。

在JDK中,Entry的具体定义如下:

static final class Entry<K,V> implements Map.Entry<K,V> {  K key;  V value;  Entry<K,V> left = null;  Entry<K,V> right = null;  Entry<K,V> parent;  boolean color = BLACK;  /** * Make a new cell with given key, value, and parent, and with * {@code null} child links, and BLACK color. */  Entry(K key, V value, Entry<K,V> parent) {  this.key = key;  this.value = value;  this.parent = parent;  }
}

4、TreeMap的put(key ,value)操作  
插入元素由put操作进行,主要包括两个过程,第一步是通过计算key找到插入元素的位置,如果新加入的key不存在直接插入;如果存在,那么就更新原节点的值。第二步是,因为插入新元素可能会破坏红黑树的属性,如果被破坏了,就要通过左右旋转等操作恢复红黑树的属性。具体代码如下:

public V put(K key, V value) {  Entry<K,V> t = root;  if (t == null) {  compare(key, key); // type (and possibly null) check  root = new Entry<>(key, value, null);  size = 1;  modCount++;  return null;  }  int cmp;  Entry<K,V> parent;  // split comparator and comparable paths  Comparator<? super K> cpr = comparator;  if (cpr != null) {  do {  parent = t;  cmp = cpr.compare(key, t.key);  if (cmp < 0)  t = t.left;  else if (cmp > 0)  t = t.right;  else  return t.setValue(value);  } while (t != null);  }  else {  if (key == null)  throw new NullPointerException();  Comparable<? super K> k = (Comparable<? super K>) key;  do {  parent = t;  cmp = k.compareTo(t.key);  if (cmp < 0)  t = t.left;  else if (cmp > 0)  t = t.right;  else  return t.setValue(value);  } while (t != null);  }  Entry<K,V> e = new Entry<>(key, value, parent);  if (cmp < 0)  parent.left = e;  else  parent.right = e;  fixAfterInsertion(e);  size++;  modCount++;  return null;
}  

TreeMap内部实现简介相关推荐

  1. 简单批处理内部命令简介(转)

    一.简单批处理内部命令简介  1.Echo 命令  打开回显或关闭请求回显功能,或显示消息.如果没有任何参数,echo 命令将显示当前回显设置. echo [{on│off}] [message]  ...

  2. [Linux Audio Driver] 高通平台内部MIC_BIAS简介

    #更新 2020.05.10 我觉得我这个标题取的不是很妥当,为了表达对技术的敬畏之心,我将原标题 <一文搞懂内部MIC_BIAS>修改为<高通平台内部MIC_BIAS简介> ...

  3. InfoVista.NET 内部数据格式简介

    一个例子: <?xml version="1.0" encoding="GB2312"?> <Folder name="root&q ...

  4. TreeMap、TreeSet简介

    TreeMap TreeMap底层采用红黑树保存每个Entry对象,红黑树是一种自平衡排序二叉树. TreeMap添加元素源码: public V put(K key, V value) {// 获取 ...

  5. java集合类深入分析之TreeMap/TreeSet篇

    2019独角兽企业重金招聘Python工程师标准>>> 简介 TreeMap和TreeSet算是java集合类里面比较有难度的数据结构.和普通的HashMap不一样,普通的HashM ...

  6. java Collection-Map 之 TreeMap

    为什么80%的码农都做不了架构师?>>>    TreeMap 内部定义了一个类  static final class Entry<K,V> implements Ma ...

  7. 计算机程序的思维逻辑 (43) - 剖析TreeMap

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>(马俊昌著),由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买:京东自营链接 ...

  8. JDK源码分析-TreeMap(1)

    概述 前面数据结构与算法笔记对红黑树进行了分析,而 TreeMap 内部就是基于红黑树实现的.示意图: 转载于:https://juejin.im/post/5d05a9bd6fb9a07ecb0ba ...

  9. 深入理解HashMap和TreeMap的区别

    文章目录 简介 HashMap和TreeMap本质区别 排序区别 Null值的区别 性能区别 共同点 深入理解HashMap和TreeMap的区别 简介 HashMap和TreeMap是Map家族中非 ...

  10. Java编程的逻辑 (43) - 剖析TreeMap

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

最新文章

  1. android+布局分块,android的List View的Item布局问题
  2. golang defer的使用
  3. 会话管理-2.1.Session介绍
  4. Postman:Postman简介、安装、入门使用方法详细攻略
  5. LayaBox IDE 安装后执行项目报错解决方案的一些记录
  6. 初中文化能学编程吗_网页编程课程来了,确定不来pick一下!!!|科创辅学进行时...
  7. outlook 2007 自动答复邮件
  8. DWR操作java对象
  9. 计算机组成原理—基本概念(不基础的部分)
  10. 库存转换是什么意思_安全库存的设置:库存计划的看家本领
  11. CSDN博客里的大学生活简历——共勉
  12. Vi编辑异常退出解决
  13. Hive Distribute by 应用之动态分区小文件过多问题优化
  14. linux添加五笔输入法,在Ubuntu16.04中为fctix小企鹅增加五笔输入法
  15. Vue双向绑定失效 v-model
  16. html首行缩进2字符,可以使用CSS属性中的【text-indent】进行设置。
  17. 一文了解 | 革兰氏阳性和阴性菌区别,致病差异,针对用药
  18. Effective C++ 条款20_宁以 pass-by-reference-to-const 替换 pass-by-value_不止于此
  19. 大学四年,这些让我起飞的计算机必看书籍
  20. 仿QQ空间文章列表+评论查询

热门文章

  1. [LeetCode]Palindrome Number 推断二进制和十进制是否为回文
  2. maven远程私服发布jar包
  3. Git之Github使用(一):Push代码到Github
  4. 挖掘经典:几乎被人遗忘的HTML七种用法
  5. JSP中的坑(一):一个空格都不能少
  6. windows系统下运行bat脚本实现后台运行及停止jar文件
  7. js模拟select控件
  8. Spring - DI循环依赖
  9. Visual Studio 2019密钥
  10. 经典排序算法(八)--选择排序Selection Sort