Java 中的 TreeMap 用于存储与 HashMap类非常相似的键值对。
不同之处在于 TreeMap 提供了一种以排序顺序存储键/值对的有效方法。
它是一个基于红黑树的“NavigableMap”实现。
TreeMap 的特性
- 它存储类似于 HashMap 的键值对。
- 它只允许不同的键。重复密钥是不可能的。
- 它不能有
null键,但可以有多个null值。 - 它按排序顺序(自然顺序)或者通过地图创建时提供的“比较器”存储键。
- 它为
containsKey、get、put和remove操作提供有保证的 log(n) 时间成本。 - 它不是同步的。
使用Collections.synchronizedSortedMap(new TreeMap())在并发环境中工作。
iterator方法返回的迭代器是快速失败的。
on it road.com
TreeMap的构造函数
- TreeMap():使用其键的自然顺序创建一个新的空树图。
- TreeMap(Comparator c):创建一个新的空树图,根据给定的比较器排序。
- TreeMap(Map map):创建一个包含与给定映射相同映射的新树映射,根据其键的自然顺序排序。
- TreeMap(SortedMap map):创建一个新的树图,其中包含与指定的排序图相同的映射并使用相同的顺序。
TreeMap 的层次结构
TreeMap 类在 Java 中声明如下。
它扩展了 AbstractMap 类并实现了 NavigableMap 接口。
这里“K”是键的类型,“V”是映射到键的值的类型。
public class TreeMap<K,V>
extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, java.io.Serializable
{
//implementation
}
TreeMap 的方法
- void clear():它从地图中删除所有键值对。
- void size():它返回此映射中存在的键值对的数量。
- void isEmpty():如果此映射不包含键值映射,则返回 true..
- boolean containsKey(Object key):如果映射中存在指定的键,则返回“true”。
- boolean containsValue(Object key):如果指定值映射到映射中的至少一个键,则返回“true”。
- Object get(Object key):它检索由指定的“key”映射的“value”,如果此映射不包含该键的映射,则为 null。
- Object remove(Object key):它从映射中删除指定键的键值对(如果存在)。
- Comparator Comparator():它返回用于对该映射中的键进行排序的比较器,如果该映射使用其键的自然顺序,则返回 null。
- Object firstKey():它返回当前在树图中的第一个(最少)键。
- Object lastKey():它返回当前在树图中的最后一个(最大)键。
- 对象天花板键(对象键):它返回大于或者等于给定键的最小键,如果没有这样的键,则返回 null。
- Object HigherKey(Object key):返回严格大于指定键的最小键。
- NavigableMap 降序映射():它返回此映射中包含的映射的逆序视图。
Java TreeMap 示例
自然排序的 TreeMap 示例
import java.util.Iterator;
import java.util.TreeMap;
public class LinkedHashMapExample
{
public static void main(String[] args)
{
// 默认自然排序
TreeMap<Integer, String> pairs = new TreeMap<>();
pairs.put(2, "B");
pairs.put(1, "A");
pairs.put(3, "C");
String value = pairs.get(3); //get method
System.out.println(value);
value = pairs.getOrDefault(5, "oops"); //getOrDefault method
System.out.println(value);
// TreeMap迭代
Iterator<Integer> iterator = pairs.keySet().iterator();
while(iterator.hasNext()) {
Integer key = iterator.next();
System.out.println("Key: " + key + ", Value: " + pairs.get(key));
}
// 从 TreeMap中删除元素
pairs.remove(3);
System.out.println(pairs);
System.out.println(pairs.containsKey(1)); //containsKey method
System.out.println(pairs.containsValue("B")); //containsValue method
System.out.println(pairs.ceilingKey(2));
}
}
输出:
C
oops
Key: 1, Value: A
Key: 2, Value: B
Key: 3, Value: C
{1=A, 2=B}
true
true
2
使用比较器自定义排序的 TreeMap 示例
import java.util.Iterator;
import java.util.TreeMap;
public class LinkedHashMapExample
{
public static void main(String[] args)
{
// 逆序排序
TreeMap<Integer, String> pairs = new TreeMap<>(Collections.reverseOrder());
pairs.put(2, "B" );
pairs.put(1, "A");
pairs.put(3, "C");
System.out.println(pairs);
}
}
输出:
{3=C, 2=B, 1=A}
日期:2020-09-17 00:09:48 来源:oir作者:oir
