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

在这个Java TreeMap教程中,我们将学习TreeMap类,它的方法,用例和其他重要细节。

目录

1. TreeMap层次结构 
2. TreeMap特征 
3. TreeMap构造函数 
4. TreeMap方法 
5. TreeMap示例 
6. TreeMap用例 
7. TreeMap性能 
8. TreeMap中的并发 
9. 结论

 

1. TreeMap层次结构

TreeMap类在Java中声明如下。它扩展了AbstractMap类并实现了NavigableMap接口。这'K'是键的类型,是键'V'映射值的类型。

TreeMap.java

public class TreeMap<K,V>

    extends AbstractMap<K,V>

    implements NavigableMap<K,V>, Cloneable, java.io.Serializable

{

    //implementation

}

 

2. TreeMap功能

关于Java TreeMap类的重点是:

  • 它存储类似于HashMap的键值对。
  • 它只允许不同的键。无法复制密钥。
  • 它不能有null密钥但可以有多个null值。
  • 它按排序顺序(自然顺序)或按Comparator地图创建时提供的密钥存储密钥。
  • 它提供了有保证的log(n)的时间成本,为containsKeygetputremove操作。
  • 它不同步。用于Collections.synchronizedSortedMap(new TreeMap())在并发环境中工作。
  • iterator方法返回的迭代器是快速失败的

 

3. TreeMap构造函数

TreeMap有五种类型的构造函数:

  1. TreeMap():使用其键的自然顺序创建一个新的空树图。
  2. TreeMap(比较器c):创建一个新的空树图,根据给定的比较器排序。
  3. TreeMap(地图):创建一个新的树图,其中包含与给定地图相同的映射,根据其键的自然顺序排序。
  4. TreeMap(SortedMap map):创建一个新的树图,其中包含相同的映射并使用与指定的有序映射相同的顺序。

 

4. TreeMap方法

我们应该学习的关于TreeMap的重要方法如下:

  1. void clear():它从地图中删除所有键值对。
  2. void size():返回此映射中存在的键值对的数量。
  3. void isEmpty():如果此映射不包含键 - 值映射,则返回true。
  4. boolean containsKey(Object key):'true'如果地图中存在指定的键,则返回。
  5. 布尔的containsValue(对象键):它返回'true'如果一个指定的值被映射到地图上的至少一个键。
  6. Object get(Object key):它检索value指定的映射key,如果此映射不包含键的映射,则返回null。
  7. Object remove(Object key):它从地图中删除指定键的键值对(如果存在)。
  8. 比较器比较器():它返回用于对此映射中的键进行排序的比较器,如果此映射使用其键的自然顺序,则返回null。
  9. Object firstKey():它返回树映射中当前的第一个(最少)键。
  10. Object lastKey():它返回树映射中当前的最后一个(最大)键。
  11. Object ceilingKey(Object key):返回大于或等于给定键的最小键,如果没有这样的键则返回null。
  12. Object higherKey(Object key):返回严格大于指定键的最小键。
  13. NavigableMap descendingMap():它返回此映射中包含的映射的逆序视图

 

5. Java TreeMap示例

5.1。具有自然排序的TreeMap示例

Java程序用自然顺序演示TreeMap方法的用法。

TreeMap示例

import java.util.Iterator;

import java.util.TreeMap;

 

public class LinkedHashMapExample

{

    public static void main(String[] args)

    {

        //Natual ordering by deafult

        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);

         

        //Iteration example

        Iterator<Integer> iterator =  pairs.keySet().iterator();

         

        while(iterator.hasNext()) {

            Integer key = iterator.next();

            System.out.println("Key: " + key + ", Value: " + pairs.get(key));

        }

         

        //Remove example

        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

5.2。使用Comparator进行自定义排序的TreeMap示例

TreeMap示例

import java.util.Iterator;

import java.util.TreeMap;

 

public class LinkedHashMapExample

{

    public static void main(String[] args)

    {

        //Sort keys in reverse order

        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}

 

6. TreeMap用例

无论是使用默认排序还是使用比较器自定义排序,TreeMap都提供了一种有效的方法来以排序的方式存储和检索其中包含的信息。这使得它成为在需要按排序顺序显示信息的场景中使用的出色工具。例如,员工信息基于他们在任何移动应用程序中的年龄或电话号码。

另一个有用的用例可以是字典,其中信息以分类的方式被记录和显示。

实际上,它们对于需要对信息进行排序以及需要快速随机访问的任何地方都很有用。如果不需要随机访问,则使用有序集或列表。

 

7. TreeMap性能

TreeMap 为大多数操作提供log(n)的性能,如add(),remove()和contains()。对于相同的操作,HashMap以恒定时间性能O(1)执行。这样,HashMap比TreeMap表现更好。

TreeMap在内存管理方面具有更好的性能,因为它不在内部维护一个数组来存储键值对。在HashMap中,数组大小是在初始化或调整大小时确定的,如果当时通常需要的话。它浪费了记忆。TreeMap没有这样的问题。

 

8. TreeMap中的并发

Map,HashMap和TreeMap的两个版本都不同步,程序员需要管理地图上的并发访问。

我们可以使用Collections.synchronizedSortedMap(new TreeMap())显式获取树图的同步视图。

TreeMap的同步视图

Map<Integer, String> syncTreeMap = Collections.synchronizedSortedMap(new TreeMap<Integer, String>());

 

syncTreeMap.put(1,  "A");

syncTreeMap.put(2,  "B" );

syncTreeMap.put(3,  "C");

 

9.结论

在本教程中,我们了解了Java TreeMap类及其内部结构。我们看到它如何以排序的方式存储键值对 - 无论是自然排序(默认)还是一些自定义键排序(使用提供的比较器)。

我们讨论了如何以及何时在实时应用程序中使用TreeMap。我们比较了Tr​​eeMap与HashMap的性能,以便了解何时使用哪个版本的Map。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/u010675669/article/details/86503289