Java中 TreeMap 的内部工作
TreeMap 类就像 HashMap。 TreeMap 存储键值对。主要区别在于 TreeMap 按升序对键进行排序。 TreeMap 根据其键的顺序进行排序,或者通过在映射创建时提供的 Comparator 进行排序,具体取决于使用的构造函数。
先决条件:
在进一步讨论之前,让我们先了解一下主要包括在 TreeMap 情况下可用的构造函数的先决条件
- TreeMap()这个默认构造函数构造了一个空的 TreeMap
- TreeMap(Map map)它使用地图中的条目创建一个 TreeMap。
- TreeMap(Comparator compare)这是一个参数构造函数,它使用Comparator对象来构造一个空的基于树的映射。它将使用比较器比较进行排序。
- TreeMap(SortedMap sortedMap)它可以用来自sortedMap的条目初始化为TreeMap 。
插图:
Input : a = ["Alice", 1], b = ["Bob", 2]
Output : TreeMap = {"Alice" = 1, "Bob" = 2}
Input : a = [1, "First"], b = [2, "Second"], c = [3, "Third"]
Output : TreeMap = {1 = "First", 2 = "Second", 3 = "Third"}
概念:红黑树
红黑树是一种自平衡二叉搜索树,其中每个节点都有一个额外的位,该位通常被解释为颜色(红色或黑色)。这些颜色用于确保树在插入和删除过程中保持平衡。虽然树的平衡性并不完美,但足以减少搜索时间并保持在 O(log n) 时间左右,其中 n 是树中元素的总数。必须注意的是,由于每个节点只需要 1 位空间来存储颜色信息,这些类型的树显示出与经典(未着色)二叉搜索树相同的内存占用。
- 顾名思义,树中每个节点的颜色都是黑色或红色。
- 根节点的颜色必须是黑色。
- 红色节点不能有红色邻居节点。
- 从根节点到空节点的所有路径都应包含相同数量的黑色节点。
上述特性导致节点具有某些属性,结果如下:
- 左边的元素总是小于父元素。
- 自然排序是在对象的逻辑比较中计算的。
- 正确的元素总是大于或等于父元素。
语法:声明一个 TreeMap 的对象或简单地创建一个 TreeMap
Map treemap = new TreeMap<>();
方法:
- 创建树图。
- 创建一些条目以输入到 TreeMap 中。
- 计算 Key {“key1”} 的哈希码。它将生成为 118。
- 使用 for 循环遍历打印 TreeMap。
实现:实现红黑树来展示 TreeMap 的内部工作
例子
Java
// Java Program to show Internal Working
// of TreeMap in Java
// Importing Map and TreeMap classes
// from java.util package
import java.util.Map;
import java.util.TreeMap;
// Standard Comparable
public class Key implements Comparable {
// Custom input
final int data = 118;
private String key;
// Constructor of this class
public Key(String key)
{
// Super keyword refers immediate parent class
// object
super();
// This keyword is a reference variable
// referring to current object
this.key = key;
}
// Print Key method
public String printKey() { return this.key; }
// Override compareTo method
@Override public int compareTo(Key obj)
{
return key.compareTo(obj.key);
}
}
// Main Class
class GFG {
// Main driver method
public static void main(String[] args)
{
// Initialize TreeMap
// Declaring object of String type
Map treemap = new TreeMap<>();
// Adding the elements in object of TreeMap
// Custom inputs
treemap.put(new Key("Key1"), "Alice");
treemap.put(new Key("Key4"), "Zeya");
treemap.put(new Key("Key3"), "Geek");
treemap.put(new Key("Key2"), "Bob");
// Iterate over object elements using for-each loop
for (Map.Entry entry :
treemap.entrySet())
// Print elements in TreeMap object
System.out.println(
"[" + entry.getKey().printKey() + " = "
+ entry.getValue() + "]");
}
}
Java
// Java Program to show Internal Working
// of TreeMap in Java
// Importing Map and TreeMap classes
// from java.util package
import java.util.Map;
import java.util.TreeMap;
// Standard Comparable
public class Key implements Comparable {
// Custom input
final int data = 118;
private String key;
// Constructor of this class
public Key(String key)
{
// Super keyword refers immediate parent class
// object
super();
// This keyword is a reference variable
// referring to current object
this.key = key;
}
// Print Key method
public String printKey() { return this.key; }
// Override compareTo method
@Override public int compareTo(Key obj)
{
return key.compareTo(obj.key);
}
}
// Main Class
class GFG {
// Main driver method
public static void main(String[] args)
{
// Initialize TreeMap
// Declaring object of String type
Map treemap = new TreeMap<>();
// Adding the elements in object of TreeMap
// Custom inputs
treemap.put(new Key("Key1"), "Alice");
treemap.put(new Key("Key4"), "Zeya");
treemap.put(new Key("Key3"), "Geek");
treemap.put(new Key("Key2"), "Bob");
// Iterate over object elements using for-each loop
for (Map.Entry entry :
treemap.entrySet())
// Print elements in TreeMap object
System.out.println(
"[" + entry.getKey().printKey() + " = "
+ entry.getValue() + "]");
}
}
Java
// Java Program to show Internal Working
// of TreeMap in Java
// Importing Map and TreeMap classes
// from java.util package
import java.util.Map;
import java.util.TreeMap;
// Standard Comparable
public class Key implements Comparable {
// Custom input
final int data = 118;
private String key;
// Constructor of this class
public Key(String key)
{
// Super keyword refers immediate parent class
// object
super();
// This keyword is a reference variable
// referring to current object
this.key = key;
}
// Print Key method
public String printKey() { return this.key; }
// Override compareTo method
@Override public int compareTo(Key obj)
{
return key.compareTo(obj.key);
}
}
// Main Class
class GFG {
// Main driver method
public static void main(String[] args)
{
// Initialize TreeMap
// Declaring object of String type
Map treemap = new TreeMap<>();
// Adding the elements in object of TreeMap
// Custom inputs
treemap.put(new Key("Key1"), "Alice");
treemap.put(new Key("Key4"), "Zeya");
treemap.put(new Key("Key3"), "Geek");
treemap.put(new Key("Key2"), "Bob");
// Iterate over object elements using for-each loop
for (Map.Entry entry :
treemap.entrySet())
// Print elements in TreeMap object
System.out.println(
"[" + entry.getKey().printKey() + " = "
+ entry.getValue() + "]");
}
}
输出说明以图形方式表示,以便了解 TreeMap 节点的内部工作方式,以便更好地理解上述输出是如何生成的。
Note:
- Performance of TreeMap is slow in comparison with HashMap and LinkedHashMap.
- Tree implementation provides guaranteed log(n) time cost for the containsKey(), get(), put() and remove() operations.