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}