TreeMap
中的元素已排序,因此我认为可能get(...)
或containsKey(...)
使用二进制搜索。这些方法是否比HashMap
中实现的方法更快,它们是否真的使用二进制搜索?
答案 0 :(得分:2)
Not binary search but the complexity must be O(logn):
此实现为containsKey,get,put和remove操作提供了有保证的log(n)时间成本。算法是对Cormen,Leiserson和Rivest的算法导论的改编。
注意它实际上是红黑树:
基于红黑树的NavigableMap实现
但请注意,尽管我总是讨厌将哈希表视为O(1)数据结构,但几乎所有实际目的都是HashMap O(1)
,除非:例如,你选择了一个非常糟糕的哈希函数或大量过载地图。
答案 1 :(得分:2)
打开课程TreeMap
和HashMap
的文档,您将得到答案。
在TreeMap
中,它说:
此实施为
containsKey
,get
,put
和remove
操作提供保证log(n)时间成本。算法是对Cormen,Leiserson和Rivest的算法导论的改编。
在HashMap
中,它说:
此实现为基本操作(
get
和put
)提供恒定时间性能,假设散列函数在存储桶之间正确地分散元素。
如您所见,HashMap
是 O(1),而TreeMap
是 O(log(n)),因此{ {1}}更快。
您可以在以下维基百科条目中阅读有关哈希表和红黑树(TreeMap使用的树的类型)的更多信息:
在这些文章的右侧,您可以看到这些结构上最常见操作的复杂性摘要。
答案 2 :(得分:1)
HashMap速度更快。它的get()
和containsKey()
方法是O(1)(如果正确实现了hashCode,则为常量时间。)
TreeMap的get()
和containsKey()
是O(log(n)),他们当然使用树结构来快速完成这些操作。
答案 3 :(得分:0)
如果您对OpenJDK 7的实现感兴趣,那么它很容易理解。是的,这是一个二元搜索:
final Entry<K,V> getEntry(Object key) {
// Offload comparator-based version for sake of performance
if (comparator != null)
return getEntryUsingComparator(key);
if (key == null)
throw new NullPointerException();
Comparable<? super K> k = (Comparable<? super K>) key;
Entry<K,V> p = root;
while (p != null) {
int cmp = k.compareTo(p.key);
if (cmp < 0)
p = p.left;
else if (cmp > 0)
p = p.right;
else
return p;
}
return null;
}
public boolean containsKey(Object key) {
return getEntry(key) != null;
}
getEntryUsingComparator
是同一个二分查找,只使用Comparator
对象。