Java TreeMap

Java 中的 TreeMap 用于存储与 HashMap类非常相似的键值对。
不同之处在于 TreeMap 提供了一种以排序顺序存储键/值对的有效方法。
它是一个基于红黑树的“NavigableMap”实现。

TreeMap 的特性

  • 它存储类似于 HashMap 的键值对。
  • 它只允许不同的键。重复密钥是不可能的。
  • 它不能有 null键,但可以有多个 null值。
  • 它按排序顺序(自然顺序)或者通过地图创建时提供的“比较器”存储键。
  • 它为 containsKeygetputremove操作提供有保证的 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