Core Java Tutorial -- TreeMap
2018-03-26 22:00
190 查看
Java TreeMap 是一个 Map 的实现,它是 Java 集合框架的一部分。
Java TreeMap
Java TreeMap Example
TreeMap vs HashMap
When to use TreeMap in Java
除了实现 Map 接口外,Java TreeMap 也实现了 NavigableMap 并间接实现了 SortedMap 接口。TreeMap 也扩展 AbstractMap 类。
TreeMap 条目按照其键的自然顺序排序。它还提供了一个构造函数来提供排序的比较器。所以如果你使用任何类作为键,请确保它提供了 equals 和 hashCode 方法, 以及用于自然排序的实现。
Java TreeMap 实现保证了 containsKey、get、put 和 remove 操作 的 log(n) 时间复杂度。
TreeMap 不是同步的,因此不是线程安全的。对于多线程环境,你可以使用 Collections.synchronizedSortedMap 方法获得同步包装。
TreeMap 迭代器的行为是快速失败的,所以任何并发修改都会抛出 ConcurrentModificationException 异常。
Java 中的 TreeMap 不允许空键,但是你可以有多个与不同键相关的空值。
输出:
注意,当我们在创建 TreeMap 没有提供 Comparator 时,它使用 Integer compareTo 方法来对键进行排序。这就是为什么即使我们以任何顺序插入键,键的顺序仍然在增加。
TreeMap 条目是按键的自然顺序排序,而 HashMap 条目不按照任何顺序存储。
TreeMap 不允许空键,而 HashMap 中可以有一个空键。
因为 TreeMap 条目按照排序存储,所以在存取对象时比 HashMap 慢一点。
TreeMap 使用基于红黑数树的 NavigableMap 实现, 而 HashMap 使用哈希(散列)算法实现。
TreeMap 实现 NavigableMap,所以由一些 HashMap 中不存在的特性。栗如:submap、first key、last key、head map、tail map 等。
我们来看一个简单的 TreeMap 示栗程序,显示 NavigableMap 方法的用法。
输出:
Java TreeMap
Java TreeMap Example
TreeMap vs HashMap
When to use TreeMap in Java
Java TreeMap
TreeMap 一些需要记住的重点:除了实现 Map 接口外,Java TreeMap 也实现了 NavigableMap 并间接实现了 SortedMap 接口。TreeMap 也扩展 AbstractMap 类。
TreeMap 条目按照其键的自然顺序排序。它还提供了一个构造函数来提供排序的比较器。所以如果你使用任何类作为键,请确保它提供了 equals 和 hashCode 方法, 以及用于自然排序的实现。
Java TreeMap 实现保证了 containsKey、get、put 和 remove 操作 的 log(n) 时间复杂度。
TreeMap 不是同步的,因此不是线程安全的。对于多线程环境,你可以使用 Collections.synchronizedSortedMap 方法获得同步包装。
TreeMap 迭代器的行为是快速失败的,所以任何并发修改都会抛出 ConcurrentModificationException 异常。
Java 中的 TreeMap 不允许空键,但是你可以有多个与不同键相关的空值。
Java TreeMap Example
让我们看一下 TreeMap 的示栗程序,来查看它在行动中的自然排序。package TreeMap; 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<Integer, String> reverseMap; reverseMap = new TreeMap<>((x, y) -> (x < y) ? -1 : ((x == y) ? 0 : 1)); map.put(10, "10"); map.put(1, "1"); map.put(5, "5"); System.out.println(map); reverseMap.put(10, "10"); reverseMap.put(1, "1"); reverseMap.put(5, "5"); System.out.println(reverseMap); } }
输出:
{1=1, 5=5, 10=10} {10=10, 5=5, 1=1} {1=1, 5=5, 10=10}
注意,当我们在创建 TreeMap 没有提供 Comparator 时,它使用 Integer compareTo 方法来对键进行排序。这就是为什么即使我们以任何顺序插入键,键的顺序仍然在增加。
TreeMap vs HashMap
TreeMap 和 HashMap 都实现了 Map 接口,并且是集合框架的一部分。我们来看看 TreeMap 和 HashMap 之间的一些区别。TreeMap 条目是按键的自然顺序排序,而 HashMap 条目不按照任何顺序存储。
TreeMap 不允许空键,而 HashMap 中可以有一个空键。
因为 TreeMap 条目按照排序存储,所以在存取对象时比 HashMap 慢一点。
TreeMap 使用基于红黑数树的 NavigableMap 实现, 而 HashMap 使用哈希(散列)算法实现。
TreeMap 实现 NavigableMap,所以由一些 HashMap 中不存在的特性。栗如:submap、first key、last key、head map、tail map 等。
When to use TreeMap in Java
大多数时候,作为 Map 实现的 HashMap 就够用了。但是如果你由一些关于排序、查找更低或者更高的键的特殊需求,使用 submap,你就要用 TreeMap 了。我们来看一个简单的 TreeMap 示栗程序,显示 NavigableMap 方法的用法。
package TreeMap; import java.util.Map; 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 Map.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); } }
输出:
{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}
相关文章推荐
- Core Java Tutorial -- SortedMap
- Core Java Tutorial -- Threads in Java
- Core Java Tutorial -- Thread Join
- Core Java Tutorial -- Thread Safety in Singleton Class
- Core Java Tutorial -- Thread Life Cycle
- Core Java Tutorial -- Daemon Thread
- Core Java Tutorial -- Thread Local
- Core Java Tutorial -- Timer Thread
- Core Java Tutorial -- HashSet
- Core Java Tutorial -- Thread Pool
- Core Java Tutorial -- Stack
- Core Java Tutorial -- Thread Safety and Java Synchronization
- Core Java Tutorial -- List
- Core Java Tutorial -- ArrayList
- Core Java Tutorial -- Thread wait, notify and notifyAll
- Core Java Tutorial -- HashMap
- Core Java Tutorial -- Thread.sleep()
- Core Java Tutorial -- Map
- Core Java Tutorial -- Queue
- Core Java Tutorial -- Iterator