java.util.TreeMap
是Java标准库中的一个类,用于实现有序的映射(Map)。它基于红黑树数据结构,提供了一个键值对的有序集合。TreeMap
类实现了NavigableMap
接口,并且继承了AbstractMap
类。以下是TreeMap
类的详细介绍:
主要特点
-
有序:
TreeMap
中的键是按照自然顺序或构造映射时提供的比较器顺序进行排序的。这使得键值对在TreeMap
中保持有序。
-
基于红黑树:
TreeMap
使用红黑树(自平衡的二叉搜索树)作为内部数据结构,保证了基本操作(如插入、删除、查找)的时间复杂度为O(log n)。
-
允许
null
键和null
值:TreeMap
不允许null
键,但允许null
值。如果尝试插入null
键,会抛出NullPointerException
。null
值是可以的,但要注意有时null
值的操作可能会引发NullPointerException
。
-
实现接口:
TreeMap
实现了NavigableMap
接口,提供了许多有用的方法,如获取范围内的子集、查找比给定键小或大的键等。
主要方法
-
构造函数:
TreeMap()
:构造一个空的TreeMap
,使用自然排序。TreeMap(Comparator<? super K> comparator)
:构造一个空的TreeMap
,使用指定的比较器进行排序。TreeMap(Map<? extends K, ? extends V> m)
:构造一个包含指定映射中所有键值对的TreeMap
。
-
基本操作:
V put(K key, V value)
:将指定的键值对插入到映射中。如果键已存在,更新其值。V get(Object key)
:返回指定键的值,如果键不存在,则返回null
。V remove(Object key)
:删除指定键的键值对。boolean containsKey(Object key)
:检查映射中是否包含指定的键。boolean containsValue(Object value)
:检查映射中是否包含指定的值。
-
导航操作:
K firstKey()
:返回映射中的第一个键。K lastKey()
:返回映射中的最后一个键。Map.Entry<K, V> ceilingEntry(K key)
:返回大于或等于指定键的最小键的映射条目。Map.Entry<K, V> floorEntry(K key)
:返回小于或等于指定键的最大键的映射条目。Map.Entry<K, V> higherEntry(K key)
:返回大于指定键的最小键的映射条目。Map.Entry<K, V> lowerEntry(K key)
:返回小于指定键的最大键的映射条目。
-
范围视图:
NavigableMap<K, V> subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive)
:返回指定范围内的子映射。NavigableMap<K, V> headMap(K toKey, boolean inclusive)
:返回小于指定键的所有键的子映射。NavigableMap<K, V> tailMap(K fromKey, boolean inclusive)
:返回大于或等于指定键的所有键的子映射。
示例代码:
package com.example;
import java.util.*;
public class Main {
public static void main(String[] args) {
// 创建一个TreeMap并插入键值对
TreeMap<String, Integer> map = new TreeMap<>();
map.put("Apple", 40);
map.put("Banana", 10);
map.put("Cherry", 20);
map.put("Date", 30);
// 输出TreeMap
System.out.println("TreeMap: " + map);
// 获取特定键的值
System.out.println("Value for 'Banana': " + map.get("Banana"));
// 删除特定键
map.remove("Cherry");
System.out.println("TreeMap after removal: " + map);
// 获取第一个和最后一个键
System.out.println("First key: " + map.firstKey());
System.out.println("Last key: " + map.lastKey());
// 获取一个范围内的子映射
//包含从Apple到Date(根据fromInclusive和toInclusive的值)范围内的所有键值对
NavigableMap<String, Integer> subMap = map.subMap("Apple", true, "Date", true);
System.out.println("SubMap: " + subMap);
}
}