Java TreeMap – Java中的TreeMap

时间:2020-02-23 14:36:58  来源:igfitidea点击:

Java TreeMap是Map的实现之一,并且是Java Collections框架的一部分。

Java TreeMap

关于Java中的TreeMap,需要记住的一些重点是:

  • 除了实现Map接口之外,Java TreeMap还实现了NavigableMap并间接实现了SortedMap接口。
    TreeMap还扩展了AbstractMap类。

  • TreeMap条目以其键的自然顺序排序。
    它还提供了一个构造函数,以提供用于排序的Comparator。
    因此,如果您使用任何类作为键,请确保其实现了Comparable接口以实现自然排序。
    查看Java集合面试问题,以了解这些方法的重要性。

  • Java TreeMap实现为containsKey,get,put和remove操作提供了保证的log(n)时间成本。

  • TreeMap不同步,因此不是线程安全的。
    对于多线程环境,可以使用Collections.synchronizedSortedMap方法获取包装同步。

  • 用于获取键集和值的TreeMap方法返回本质上是快速失败的Iterator,因此任何并发修改都会引发ConcurrentModificationException。

  • Java中的TreeMap不允许使用空键,但是您可以将多个空值与不同的键相关联。

Java TreeMap示例

让我们看一下Java TreeMap示例程序,看看它在操作中是自然排序的。

package com.theitroad.java;

import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;

public class JavaTreeMapExample {

	public static void main(String[] args) {
		
		Map<Integer,String> map = new TreeMap<>();
		
		map.put(10, "10");
		map.put(1, "1");
		map.put(5, "5");
		
		System.out.println(map);
		
		map = new TreeMap<>(new Comparator<Integer>() {

			@Override
			public int compare(Integer x, Integer y) {
				return (x > y) ? -1 : ((x == y) ? 0 : 1);
			}
			
		});
		map.put(10, "10");
		map.put(1, "1");
		map.put(5, "5");
		System.out.println(map);

	}

}

它将产生以下输出。

{1=1, 5=5, 10=10}
{10=10, 5=5, 1=1}

请注意,当我们在创建TreeMap时未提供Comparator时,它使用Integer的compareTo方法来对键进行排序。
这就是为什么即使我们按任意顺序插入键,键也按递增顺序排列的原因。

下次,我们将提供Comparator实施以颠倒顺序,TreeMap会使用该顺序。
因此,密钥以降序存储。

为简单起见,我在上面提供了Comparator的匿名类实现,我们可以使用lambda表达式在同一行中执行相同的操作。

map = new TreeMap<>((x,y) -> {return (x > y) ? -1 : ((x == y) ? 0 : 1);});

TreeMap与HashMap

TreeMap和HashMap都实现了Map接口和集合框架的一部分。
让我们看一下TreeMap与HashMap之间的一些区别。

  • TreeMap条目以键的自然顺序排序,而HashMap则不以任何顺序存储条目。

  • TreeMap不允许使用null键,而我们在HashMap中可以使用一个null键。

  • 由于TreeMap以排序的方式存储条目,因此HashMap在存储和检索对象方面要慢一些。

  • TreeMap使用基于Red-Black树的NavigableMap实现,而HashMap使用哈希算法实现。

  • TreeMap实现了NavigableMap,因此您可以获得HashMap中不存在的一些另外功能。
    例如–子图,第一个键,最后一个键,头部图,尾部图等。

何时在Java中使用TreeMap

大多数时候,HashMap足以在您的程序中用作Map实现。
但是,如果您有一些与排序有关的特殊要求,查找下一个较低和较高的键,在子图上工作,则可以使用TreeMap。

让我们看一个简单的TreeMap示例程序,该程序显示NavigableMap方法的用法。

package com.theitroad.java;

import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;

public class JavaTreeMapNavigationExamples {

	public static void main(String[] args) {
		
		//we have to define object as TreeMap to use NavigableMap functions
		TreeMap<Integer,String> map = new TreeMap<>();
		for(int i=0;i<10;i++) {
			map.put(i, i+"");
		}
		
		System.out.println(map);
		
		//find id closest to 5, lower and higher
		Entry<Integer,String> entry = map.lowerEntry(5);
		System.out.println("Closest Lower key than 5 is "+entry);
		entry = map.higherEntry(5);
		System.out.println("Closest Higher key than 5 is "+entry);
		
		System.out.println("Closest Lower key than 4 is "+map.lowerKey(4));
		
		entry = map.floorEntry(5);
		System.out.println("Closest floor entry than 5 is "+entry);
		
		entry = map.ceilingEntry(4);
		System.out.println("Closest ceiling key than 4 is "+entry);
		
		entry = map.firstEntry();
		System.out.println("First Entry is "+entry);

		entry = map.lastEntry();
		System.out.println("Last Entry is "+entry);
		
		Map<Integer, String> reversedMap = map.descendingMap();
		System.out.println("Reversed Map: "+reversedMap);
		
		//poll and remove first, last entries
		entry = map.pollFirstEntry();
		System.out.println("First Entry is "+entry);
		entry = map.pollLastEntry();
		System.out.println("Last Entry is "+entry);
		System.out.println("Updated Map: "+map);
		
		//submap example
		Map<Integer, String> subMap = map.subMap(2, true, 6, true);
		System.out.println("Submap: "+subMap);
		
		subMap = map.headMap(5, true);
		System.out.println("HeadMap: "+subMap);

		subMap = map.tailMap(5, true);
		System.out.println("TailMap: "+subMap);
	}

}

当我们执行以上TreeMap示例程序时,它将产生以下输出。

{0=0, 1=1, 2=2, 3=3, 4=4, 5=5, 6=6, 7=7, 8=8, 9=9}
Closest Lower key than 5 is 4=4
Closest Higher key than 5 is 6=6
Closest Lower key than 4 is 3
Closest floor entry than 5 is 5=5
Closest ceiling key than 4 is 4=4
First Entry is 0=0
Last Entry is 9=9
Reversed Map: {9=9, 8=8, 7=7, 6=6, 5=5, 4=4, 3=3, 2=2, 1=1, 0=0}
First Entry is 0=0
Last Entry is 9=9
Updated Map: {1=1, 2=2, 3=3, 4=4, 5=5, 6=6, 7=7, 8=8}
Submap: {2=2, 3=3, 4=4, 5=5, 6=6}
HeadMap: {1=1, 2=2, 3=3, 4=4, 5=5}
TailMap: {5=5, 6=6, 7=7, 8=8}