您的位置:首页 > 编程语言 > Java开发

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

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}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: