Java TreeMap – Java中的TreeMap
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}

