【发布时间】:2022-01-24 20:26:24
【问题描述】:
我不明白为什么 TreeMap 被称为 TreeMap 而不是 SortedMap。据我了解,TreeMap 是一个自动对其元素进行排序的地图。计算机科学中的树就像一个图。那为什么呢?
【问题讨论】:
标签: java data-structures
我不明白为什么 TreeMap 被称为 TreeMap 而不是 SortedMap。据我了解,TreeMap 是一个自动对其元素进行排序的地图。计算机科学中的树就像一个图。那为什么呢?
【问题讨论】:
标签: java data-structures
因为TreeMap是由Red–black tree实现的
【讨论】:
我不明白为什么 TreeMap 被称为 TreeMap 而不是 SortedMap。
TreeMap是接口SortedMap的实现。或SortedMap由TreeMap实现。
据我了解,TreeMap 是一个自动对其元素进行排序的地图。
是的,TreeMap 保证其元素默认按升序键排序。
很好的阅读here
【讨论】:
正如F. Ju所说,TreeMap是由红黑树实现的。也可以看Javadocs:
基于红黑树的 SortedMap 接口实现。这个 类保证地图将按升序键顺序排序 根据键类的自然顺序(参见 Comparable), 或由创建时提供的比较器,取决于哪个 使用了构造函数。
请注意,排序映射维护的顺序(无论是否 提供了显式比较器)必须与 equals 一致,如果 这个排序后的地图是为了正确实现 Map 接口。 (看 Comparable 或 Comparator 用于精确定义一致 等于。)之所以如此,是因为 Map 接口是根据 equals 操作,但 map 使用它的执行所有键比较 compareTo(或比较)方法,因此被认为相等的两个键 从排序图的角度来看,这种方法是相等的。这 排序映射的行为是明确定义的,即使它的排序是 与equals不一致;它只是不遵守总合同 地图界面。
【讨论】:
是的,Java 内部在实现中使用红黑树作为数据结构。红黑树是一种自平衡二叉搜索树,在这里用于根据您提供的比较器实现或键的自然顺序来保持元素排序。 因此,如果您查看下面 TreeMap.getEntryUsingComparator(Object) 方法(从 TreeMap.get(Object) 方法内部调用)的实现 -
final Entry<K,V> getEntryUsingComparator(Object key) {
@SuppressWarnings("unchecked")
K k = (K) key;
Comparator<? super K> cpr = comparator;
if (cpr != null) {
Entry<K,V> p = root;
while (p != null) {
int cmp = cpr.compare(k, p.key);
if (cmp < 0)
p = p.left;
else if (cmp > 0)
p = p.right;
else
return p;
}
}
return null;
}
这是通过循环搜索并将给定的键与树的根进行比较,然后决定我们应该去哪个分支,左边还是右边。这只是为了表明它是基于树的,这就是它被命名为 TreeMap 的原因。
【讨论】: