How TreeMap Works Internally in Java17 Mar 2025 | 4 分钟阅读 在Java面试题中,最常被问到的问题是Java中TreeMap的内部工作原理,或者TreeMap的内部实现是什么。 在本节中,我们将学习Java中TreeMap的内部工作原理。在深入了解内部工作原理之前,首先要理解什么是TreeMap。 Java中的TreeMapTreeMap是Java集合框架的成员类。它实现了Map, NavigableMap, Sorted, Cloneable和Serializable接口。它继承了AbstractMap类。与HashMap一样,它也以键值对的形式存储数据。HashMap和TreeMap的区别在于HashMap不对键排序,而TreeMap则按照自然顺序(升序)对键进行排序。我们也可以使用Comparator来自定义排序。 与HashMap和LinkedHashMap相比,它的速度较慢。它的类方法如get(), put(), containsKey()等提供了O(log n)的复杂度。它本质上是非线程安全的,意味着它不是线程安全的。对于多线程环境,我们可以使其线程安全。 我们知道,在树中,一个节点有三个引用:父节点、右子节点和左子节点。在下面的图中,我们展示了TreeMap中节点的结构。 ![]() 树数据结构遵循以下属性:
TreeMap的内部工作原理与HashMap和LikedHasMap不同,它不使用哈希来存储键值对。在内部,它使用一种称为红黑树的数据结构。换句话说,它使用红黑树算法对TreeMap对象的键进行排序。为了理解TreeMap的内部工作原理,我们必须理解红黑树算法。 红黑树算法红黑树是一种自平衡二叉搜索树(BST)。它具有以下属性:
让我们通过一个例子来理解TreeMap的实现。 TreemapExample.java 输出 B Delhi D Jaipur F Agra H Ahmedabad P Patna 让我们看看这些元素是如何按照自然顺序存储在TreeMap中的。 添加第一个元素 在上面的代码片段中,我们插入了第一个元素(H, Ahmedabad)。其中H是键,Ahmedabad是值。它将成为TreeMap的根节点。TreeMap将按如下方式存储它。 ![]() 添加第二个元素 我们插入了第二个元素(D, Jaipur)。其中D是键,Jaipur是值。键D在逻辑上小于键H。根据规则,较小的值将放在父节点的左侧。因此,值Jaipur将放在Ahmedabad的左侧,而Ahmedabad成为Jaipur的父节点。Jaipur的值将存储在TreeMap中,如下所示。 ![]() 添加第三个元素 我们插入了第三个元素(B, Delhi)。其中B是键,Delhi是值。键B小于键D。因此,它将被添加到Jaipur的左侧,Jaipur成为Delhi的父节点。Delhi的值将存储在TreeMap中,如下所示。 ![]() 添加第四个元素 我们插入了第四个元素(F, Agra)。其中F是键,Agra是值。键F大于键B和D。因此,它将被存储在Jaipur的右侧,如下所示。Jaipur也将是Agra的父节点。 ![]() 添加第五个元素 我们插入了第五个元素(P, Patna)。其中P是键,Patna是值。键P大于键B、D和F。因此,它将被存储在Ahmedabad的右侧,如下所示。Ahmedabad也将是Patna的父节点。 ![]() 在将所有元素插入树之后,排序后的TreeMap如下所示: ![]() 上面的树表示了排序后的键。我们可以按顺序读出这些键:B, D, F, H, P。 下一主题Java计算自然数之和的程序 |
伯努利数是一类特殊的数字,在数论和分析中起着重要作用。这些数字主要用于几个三角函数、伽马函数、双曲函数等的级数展开。第n个伯努利数用Bn表示,可以通过以下方式定义... Nth Bernoulli number is denoted by Bn that can be defined by the following...
7 分钟阅读
在不断发展的编程世界中,及时了解编程语言的最新增强功能和特性至关重要。随着 Java 9 的发布,开发人员接触到了各种旨在提高语言功能和使编码更高效的新特性。其中一个...
阅读 4 分钟
在数论中,没有什么比 Hardy-Ramanujan 定理更迷人的了。它展示了数字在素因子方面的分布有多么真实。Hardy 在 1917 年基于 Srinivasa Ramanujan 的观察讨论了该定理,该定理认为 ω(n) = 个数...
5 分钟阅读
Java 是一种通用且强大的编程语言,已成为开发各种领域应用程序的最受欢迎的选择之一。凭借其丰富的功能、平台独立性和广泛的社区支持,Java 已成为构建实际应用程序的首选语言……
阅读 4 分钟
为了解决 Java 中的子数组求和索引问题,我们正在寻找连续子数组的那些特定索引,这些索引加起来等于目标值。这个问题在算法面试中很常见,尤其是在讨论使用哈希映射优化时间复杂度时。问题陈述给定...
5 分钟阅读
在计算机网络领域,高效的数据传输是一个关键问题。滑动窗口协议是一种众所周知的技术,在确保发送方和接收方之间可靠且有序的数据交换方面发挥着重要作用。在本节中,我们将深入探讨...
阅读 4 分钟
在编程世界中,模拟现实世界场景既有趣又有教育意义。其中一个场景是掷骰子,这是机会游戏中常见的元素。在本节中,我们将探讨如何创建一个 Java 程序来模拟掷 N 个骰子……
阅读 4 分钟
java.text.ChoiceFormat 是一个包含 equals() 函数的类。当比较两个 ChoiceFormat 对象时,ChoiceFormat 类用于确定比较的布尔值。语法:public boolean equals(Object obj_name) 参数:-其中 Obj 是一个参数,一个完全不同的 ChoiceFormat 对象用于比较,它……
阅读 2 分钟
Java 8 为接口引入了多项重要功能和增强功能,使其功能更加强大和灵活。这些新功能扩展了接口的功能,并在 Java 语言的演进中发挥了至关重要的作用。以下是 Java 中引入的一些关键功能...
阅读 3 分钟
给出了一个数字 n。我们的任务是找出 1 到 n 之间存在的自描述数字。自描述数字 m 是一个数字,它在基数 b 中包含 b 个数字,其中最高有效数字位于 0 位置,...。
5 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India