TreeMap<K, V>
TreeMap<K, V> 是 Java 集合框架中的一个重要类,它实现了 NavigableMap<K, V> 接口,而 NavigableMap<K, V> 继承自 SortedMap<K, V> 接口。下面将从多个方面详细介绍 TreeMap<K, V>。
特性
- 键值对存储:
TreeMap以键值对(key - value)的形式存储数据,每个键都是唯一的,键不允许为null,但值可以为null。 - 有序性:
TreeMap会根据键的自然顺序或者创建TreeMap时指定的比较器(Comparator)对键进行排序。如果键实现了Comparable接口,TreeMap会使用键的自然顺序;如果在创建TreeMap时传入了Comparator对象,则使用该比较器定义的顺序。 - 基于红黑树实现:红黑树是一种自平衡的二叉搜索树,这使得
TreeMap在插入、删除和查找操作上的时间复杂度为。
构造方法
TreeMap():创建一个新的空TreeMap,使用键的自然顺序进行排序。键必须实现Comparable接口。
import java.util.TreeMap;
public class TreeMapExample {
public static void main(String[] args) {
TreeMap<String, Integer> map = new TreeMap<>();
map.put("apple", 1);
map.put("banana", 2);
map.put("cherry", 3);
System.out.println(map);
}
}
TreeMap(Comparator<? super K> comparator):创建一个新的空TreeMap,使用指定的比较器进行排序。
import java.util.Comparator;
import java.util.TreeMap;
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
public class TreeMapWithComparator {
public static void main(String[] args) {
Comparator<Person> ageComparator = Comparator.comparingInt(Person::getAge);
TreeMap<Person, Integer> map = new TreeMap<>(ageComparator);
map.put(new Person("Alice", 25), 1);
map.put(new Person("Bob", 20), 2);
map.put(new Person("Charlie", 30), 3);
System.out.println(map);
}
}
TreeMap(Map<? extends K, ? extends V> m):创建一个包含指定Map中所有键值对的TreeMap,使用键的自然顺序进行排序。
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
public class TreeMapFromMap {
public static void main(String[] args) {
Map<String, Integer> anotherMap = new HashMap<>();
anotherMap.put("apple", 1);
anotherMap.put("banana", 2);
TreeMap<String, Integer> map = new TreeMap<>(anotherMap);
System.out.println(map);
}
}
TreeMap(SortedMap<K, ? extends V> m):创建一个包含指定SortedMap中所有键值对的TreeMap,使用与指定SortedMap相同的比较器进行排序。
常用方法
- 插入和更新操作put(K key, V value):将指定的键值对插入到 TreeMap 中。如果键已经存在,则更新该键对应的值。返回该键之前关联的值,如果键不存在则返回 null。
TreeMap<String, Integer> map = new TreeMap<>();
Integer oldValue = map.put("apple", 1);
- **`putAll(Map<? extends K, ? extends V> m)`**:将指定 `Map` 中的所有键值对复制到当前 `TreeMap` 中。
Map<String, Integer> anotherMap = new HashMap<>();
anotherMap.put("banana", 2);
map.putAll(anotherMap);
- 删除操作remove(Object key):从 TreeMap 中移除指定键对应的键值对。返回该键关联的值,如果键不存在则返回 null。
Integer removedValue = map.remove("apple");
- 查询操作get(Object key):返回指定键关联的值,如果键不存在则返回 null。
Integer value = map.get("apple");
- **`containsKey(Object key)`**:判断 `TreeMap` 中是否包含指定的键,包含返回 `true`,否则返回 `false`。
boolean hasKey = map.containsKey("apple");
- **`containsValue(Object value)`**:判断 `TreeMap` 中是否包含指定的值,包含返回 `true`,否则返回 `false`。
boolean hasValue = map.containsValue(1);
- **`firstKey()`**:返回 `TreeMap` 中的第一个(最小的)键。
String firstKey = map.firstKey();
- **`lastKey()`**:返回 `TreeMap` 中的最后一个(最大的)键。
String lastKey = map.lastKey();
- **`ceilingKey(K key)`**:返回大于或等于给定键的最小键;如果不存在这样的键,则返回 `null`。
String ceilingKey = map.ceilingKey("apple");
- **`floorKey(K key)`**:返回小于或等于给定键的最大键;如果不存在这样的键,则返回 `null`。
String floorKey = map.floorKey("apple");
- 遍历操作entrySet():返回一个包含 TreeMap 中所有键值对的 Set 视图,每个键值对用 Map.Entry<K, V> 对象表示。遍历该 Set 可以按照键的排序顺序获取键值对。
import java.util.Map;
import java.util.TreeMap;
public class TreeMapTraversal {
public static void main(String[] args) {
TreeMap<String, Integer> map = new TreeMap<>();
map.put("apple", 1);
map.put("banana", 2);
map.put("cherry", 3);
for (Map.Entry<String, Integer> entry : map.entrySet()) {
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println("Key: " + key + ", Value: " + value);
}
}
}
应用场景
- 排序需求:当需要根据键的顺序对键值对进行排序时,
TreeMap是一个很好的选择。例如,按照日期排序的事件记录,按照字母顺序排序的单词统计等。 - 范围查询:
TreeMap提供了一些方法用于进行范围查询,如subMap()、headMap()和tailMap()等,可以方便地获取指定范围的键值对。
注意事项
- 键的比较:如果使用无参构造函数创建
TreeMap,键必须实现Comparable接口;如果使用带比较器的构造函数,则无需键实现Comparable接口。 - 线程安全:
TreeMap不是线程安全的,如果需要在多线程环境下使用,可以考虑使用ConcurrentSkipListMap或通过Collections.synchronizedSortedMap方法将其包装成线程安全的集合。
import java.util.Collections; import java.util.SortedMap; import java.util.TreeMap; SortedMap<String, Integer> synchronizedMap = Collections.synchronizedSortedMap(new TreeMap<>());
综上所述,TreeMap 是一个非常实用的集合类,适合需要对键进行排序和范围查询的场景。
Java集合框架 文章被收录于专栏
Java集合框架是Java提供的一组用于存储和操作数据的类和接口,它位于java.util包中,为开发者提供了强大且灵活的数据存储和处理能力。以下将从整体架构、主要接口、常用实现类、使用场景以及示例代码等方面详细介绍Java集合框架。
