Java中的TreeMap底层源码分析

 更新时间:2023年12月15日 08:30:48   作者:爱喝咖啡的程序员  
这篇文章主要介绍了Java中的TreeMap底层源码分析,TreeMap与Hashmap、LinkedHashMap不同,他的底层不再是数组,而是一颗红黑树,在插入、删除或者替换元素时,TreeMap能按照事先约定的顺序来对key进行排序和迭代查询,需要的朋友可以参考下

一. 基本原理和优缺点

TreeMap与Hashmap、LinkedHashMap不同,他的底层不再是数组,而是一颗红黑树。

在插入、删除或者替换元素时,TreeMap能按照事先约定的顺序来对key进行排序和迭代查询。

支持二叉搜索,因此做查询操作时,时间复杂度是O(logn),虽然比起纯粹使用数组要慢O(1),但是比普通的链表要快O(n)。

插入数据类似链表,只调整几个指针就实现插入操作。

TreeMap的缺点在于,为了使用红黑树,每次新增、删除、修改一个节点后,都需要重新调整整颗树,达到红黑树的要求,这个调整的过程可能涉及到变色,也可能涉及到左旋、右旋,所以耗时啊!

二. 源码分析

2.1 put(K key, V value)

TreeMap<Integer, String> map = new TreeMap<>();
map.put(2, "张三");
map.put(1, "李四");
map.put(3, "王五");
map.put(4, "赵六");

Treemap默认使用key的升序排序,如果遍历上方的map,能获取到1->2->3->4排列顺序的key-value对。

我们也可以自定义比较key的方法,具体的做法如下:

Map<Integer, String> map = new TreeMap<Integer, String>(new Comparator<Integer> () {
	@Override
	public int compare(Integer o1, Integer o2) {
		return o2 - o1;
	}
}) {};

此时,再次遍历map,能获取到4->3->2->1排列顺序的key-value对。

我们可以把TreeMap put( )方法的源码分解成几个部分。

首先,判断当前TreeMap有没有节点,如果连一个节点都没有,那好办,就拿着本次待新增的k-v,做成一个节点,此时红黑树只有一个节点。

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;
}

接着,将待插入的key与根节点对应的key进行比较,这里就可以自定义比较方式了。

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();
	@SuppressWarnings("unchecked")
		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);
}

上图中这么大一坨代码,无非就是列举了两种情况,如果没有显示的给出Comparator,则使用key的compareTo()方法比较大小。如果给出了显示的Comparator,则使用自定义的compare()方法进行比较。

然后,把较小的节点挂到根节点的左边,把较大的节点挂到根节点的右边。这不就是二叉搜索树的概念么。

if (cmp < 0)
	parent.left = e;
else
	parent.right = e;

最后,使用红黑树相关的算法,利用变色啊、旋转啊等手段,使添加了节点的二叉搜索树重新成为红黑树。

fixAfterInsertion(e);

2.2 红黑树节点的结构

K key;
V value;
Entry<K,V> left;
Entry<K,V> right;
Entry<K,V> parent;
boolean color = BLACK;

到此这篇关于Java中的TreeMap底层源码分析的文章就介绍到这了,更多相关TreeMap源码分析内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java获取月份的三种方法总结

    Java获取月份的三种方法总结

    这篇文章主要给大家介绍了关于Java获取月份的三种方法,文中分别介绍了使用java.util.Date、java.util.Calendar和java.time包中的LocalDate类,推荐使用java.time包中的LocalDate,因为它提供了更为简洁和强大的功能,需要的朋友可以参考下
    2024-12-12
  • Springboot中的Validation参数校验详解

    Springboot中的Validation参数校验详解

    这篇文章主要介绍了Springboot中的Validation参数校验详解,Springboot参数校验是一种常用的验证机制,在传递参数时进行校验,以确保参数的有效性和正确性,该机制可以帮助开发者在代码实现前就避免一些常见的错误,需要的朋友可以参考下
    2023-10-10
  • 详解在Spring-Boot中实现通用Auth认证的几种方式

    详解在Spring-Boot中实现通用Auth认证的几种方式

    这篇文章主要介绍了详解在Spring-Boot中实现通用Auth认证的几种方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • kafka生产实践(详解)

    kafka生产实践(详解)

    下面小编就为大家带来一篇kafka生产实践(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Spring AOP面向切面编程实现原理方法详解

    Spring AOP面向切面编程实现原理方法详解

    这篇文章主要介绍了Spring AOP面向切面编程实现原理方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Spring Boot整合Mybatis并完成CRUD操作的实现示例

    Spring Boot整合Mybatis并完成CRUD操作的实现示例

    这篇文章主要介绍了Spring Boot整合Mybatis并完成CRUD操作的实现示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • HashMap底层原理全面详解面试绝对不慌

    HashMap底层原理全面详解面试绝对不慌

    这篇文章主要介绍了HashMap底层实现原理详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • 详解SpringMVC的url-pattern配置及原理剖析

    详解SpringMVC的url-pattern配置及原理剖析

    这篇文章主要介绍了SpringMVC的url-pattern配置及原理剖析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • MyBatis实现物理分页的实例

    MyBatis实现物理分页的实例

    这篇文章主要介绍了MyBatis实现物理分页的实例,MyBatis使用RowBounds实现的分页是逻辑分页,有兴趣的可以了解一下。
    2017-01-01
  • java sftp下载文件报错Caused by:com.jcraft.jsch.JSchException:session is down问题

    java sftp下载文件报错Caused by:com.jcraft.jsch.JSchExcep

    文章讲述了作者在日常工作中遇到的JSch连接问题,经过分析发现是由于连接泄露导致的,作者提出了解决方案,并给出了使用建议:1.在finally代码块中关闭连接;2.在真正使用阶段再创建连接,避免创建后不使用又忘记关闭连接
    2024-11-11

最新评论