Java TreeMap

1 什么是Java TreeMap

Java TreeMap类是基于红黑树的实现。它提供了一种有效的方法来按排序顺序存储键值对。

关于Java TreeMap类的核心要点是:

  • Java TreeMap存储key-value对。它实现了NavigableMap接口并继承了AbstractMap类。
  • Java TreeMap不能存储重复元素。
  • Java TreeMap不能包含一个null键,但是可以包含多个null值。
  • Java TreeMap是非同步(线程不安全的)。
  • Java TreeMap元素是有序的(升序)。

2 Java TreeMap的语法

public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, Serializable  

3 Java TreeMap的构造方法

构造方法 描述
TreeMap() 用于构造一个空的TreeMap,该TreeMap将使用其键的自然顺序进行排序。
TreeMap(Comparator<? super K> comparator) 用于构造一个空TreeMap,该TreeMap将使用比较器进行排序。
TreeMap(Map<? extends K,? extends V> m) 用于指定Map的条目来初始化TreeMap,该TreeMap将使用键的自然顺序进行排序。
TreeMap(SortedMap<K,? extends V> m) 用于使用SortedMap中的条目初始化TreeMap,这些条目将以与SortedMap相同的顺序排序。

4 Java TreeMap的方法

方法 描述
Map.Entry<K,V> ceilingEntry(K key) 返回具有最小键值(大于或等于指定键)的键值对,如果没有这样的键,则返回null。
K ceilingKey(K key) 返回最小键,大于指定键;如果没有这样的键,则返回null。
void clear() 删除Map的所有键值对。
Object clone() 返回TreeMap实例的浅表副本。
Comparator<? super K> comparator() 返回按顺序排列键的比较器;如果映射使用自然顺序,则返回null。
NavigableSet<K> descendingKeySet() 返回Map中所有key的逆序NavigableSet集合。
NavigableMap<K,V> descendingMap() 以降序返回指定的键值对。
Map.Entry firstEntry() 返回键值最小的键值对。
Map.Entry<K,V> floorEntry(K key) 返回最大的键,小于或等于指定的键;如果没有这样的键,则返回null。
void forEach(BiConsumer<? super K,? super V> action) 对Map中的每个条目执行给定的操作,直到所有条目都已处理或该操作引发异常为止。
SortedMap<K,V> headMap(K toKey) 返回键值严格小于toKey的键值对。
NavigableMap<K,V> headMap(K toKey, boolean inclusive) 返回其键小于(或等于(如果包含)为true的话)toKey的键值对。
Map.Entry<K,V> higherEntry(K key) 返回严格大于给定键的最小键;如果没有这样的键,则返回null。
K higherKey(K key) 如果Map包含指定键的映射,则用于返回true。
Set keySet() 返回Map中所有Entry(键值对)的集合。
Map.Entry<K,V> lastEntry() 返回具有最大键的键值对;如果没有这样的键,则返回null。
Map.Entry<K,V> lowerEntry(K key) 返回与最大键严格小于给定键的key-value的Entry对象;如果没有这样的键,则返回null。
K lowerKey(K key) 返回的最大key严格小于给定的key;如果没有这样的key,则返回null。
NavigableSet<K> navigableKeySet() 返回Map中包含所有key的NavigableSet集合。
Map.Entry<K,V> pollFirstEntry() 删除并返回与Map中最小键关联的key-value映射;如果映射为空,则返回null。
Map.Entry<K,V> pollLastEntry() 删除并返回与Map中最大键关联的key-value映射;如果映射为空,则返回null。
V put(K key, V value) 在Map中插入具有指定键的指定值。
void putAll(Map<? extends K,? extends V> map) 用于将所有键值对从一个Map复制到另一个Map。
V replace(K key, V value) 将指定的值替换为指定的键。
boolean replace(K key, V oldValue, V newValue) 用指定键的新值替换旧值。
void replaceAll(BiFunction<? super K,? super V,? extends V> function) 用在该条目上调用给定函数的结果替换每个条目的值,直到处理完所有条目或该函数引发异常为止。
NavigableMap<K,V> subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) 返回key-value对,其键的范围从fromKey到toKey。
SortedMap<K,V> subMap(K fromKey, K toKey) 返回key-value对,其键的范围从fromKey(包括)到toKey(不包括)。
SortedMap<K,V> tailMap(K fromKey) 返回键值大于或等于fromKey的键值对。
NavigableMap<K,V> tailMap(K fromKey, boolean inclusive) 从键返回大于(或等于,如果包含在内,则为真)的键/值对。
boolean containsKey(Object key) 如果Map包含指定key的映射,则返回true。
boolean containsValue(Object value) 如果Map将一个或多个key映射到指定值,则返回true。
K firstKey() 用于返回TreeMap中当前的第一个(最低)键。
V get(Object key) 用于返回TreeMap将指定键映射到的值。
K lastKey() 用于返回TreeMap中当前的最后一个(最高)键。
V remove(Object key) 从TreeMap中删除指定键的键值对。
Set<Map.Entry<K,V>> entrySet() 返回TreeMap中所有Entry的集合。
int size() 返回哈希表中存在的键值对的数量。
Collection values() 返回TreeMap中包含value的集合。

5 Java TreeMap的例子

package com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
/**
 * Java TreeMap的例子
 */
import java.util.*;

class Demo{

    public static void main(String args[]){
        TreeMap<Integer,String> map=new TreeMap<Integer,String>();
        map.put(100,"Eric");
        map.put(102,"Jack");
        map.put(101,"Mark");
        map.put(103,"Rose");

        for(Map.Entry m:map.entrySet()){
            System.out.println(m.getKey()+" "+m.getValue());
        }
    }
}

输出结果为:

100 Eric
101 Mark
102 Jack
103 Rose

6 Java TreeMap的例子:remove()

package com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
/**
 * Java TreeMap的例子
 */
import java.util.*;

public class Demo {

    public static void main(String args[]) {
        TreeMap<Integer,String> map=new TreeMap<Integer,String>();
        map.put(100,"Eric");
        map.put(102,"Jack");
        map.put(101,"Rose");
        map.put(103,"Lucy");
        System.out.println("执行remove()方法前");
        for(Map.Entry m:map.entrySet())
        {
            System.out.println(m.getKey()+" "+m.getValue());
        }
        map.remove(102);
        System.out.println("执行remove()方法后");
        for(Map.Entry m:map.entrySet())
        {
            System.out.println(m.getKey()+" "+m.getValue());
        }
    }
}

输出结果为:

执行remove()方法前
100 Eric
101 Rose
102 Jack
103 Lucy
执行remove()方法后
100 Eric
101 Rose
103 Lucy

7 Java TreeMap的例子:NavigableMap

package com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
/**
 * Java TreeMap的例子
 */
import java.util.*;

class Demo{

    public static void main(String args[]){
        NavigableMap<Integer,String> map=new TreeMap<Integer,String>();
        map.put(100,"Eric");
        map.put(102,"Jack");
        map.put(101,"Mark");
        map.put(103,"Rose");
        //保持降序
        System.out.println("descendingMap: "+map.descendingMap());
        //返回键值小于或等于指定键的键值对。
        System.out.println("headMap: "+map.headMap(102,true));
        //返回键值大于或等于指定键的键值对。
        System.out.println("tailMap: "+map.tailMap(102,true));
        //返回键值对存在于指定键之间。
        System.out.println("subMap: "+map.subMap(100, false, 102, true));
    }
}

输出结果为:

descendingMap: {103=Rose, 102=Jack, 101=Mark, 100=Eric}
headMap: {100=Eric, 101=Mark, 102=Jack}
tailMap: {102=Jack, 103=Rose}
subMap: {101=Mark, 102=Jack}

8 Java TreeMap的例子:SortedMap

package com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
/**
 * Java TreeMap的例子
 */
import java.util.*;

class Demo{

    public static void main(String args[]){
        SortedMap<Integer,String> map=new TreeMap<Integer,String>();
        map.put(100,"Eric");
        map.put(102,"Jack");
        map.put(101,"Paul");
        map.put(103,"Lucas");
        //返回键小于指定键的键值对。
        System.out.println("headMap: "+map.headMap(102));
        //返回键值大于或等于指定键的键值对。
        System.out.println("tailMap: "+map.tailMap(102));
        //返回键值对存在于指定键之间。
        System.out.println("subMap: "+map.subMap(100, 102));
    }
}

输出结果为:

headMap: {100=Eric, 101=Paul}
tailMap: {102=Jack, 103=Lucas}
subMap: {100=Eric, 101=Paul}

9 HashMap和TreeMap的区别

HashMap TreeMap
HashMap可以包含一个Null键。 TreeMap不能包含任何Null键。
HashMap的元素是无序的。 TreeMap的元素是有序的(升序)。