在TreeMap中,元素是排序的;在HashMap中,元素是无序的。因此,如果我考虑使用
get
、put
和remove
方法,应该选择哪个映射以获得更好的性能?get
、put
和remove
方法,应该选择哪个映射以获得更好的性能?除非你需要排序,否则请使用HashMap
。 HashMap
更快。
话虽如此,您可以通过将通用接口用作声明来轻松切换:
Map<String,String> M = new HashMap<String,String>();
...use M lots of places...
接下来你只需要调整一个位置,你的代码就可以使用新的地图类型。
一个简单的时间测试:
import java.util.*;
class TimingTest {
public static void main(String[] args) {
Map<String,String> M = new HashMap<String,String>();
long start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
M.put(Integer.toString(i), "foo");
}
long end = System.currentTimeMillis();
System.out.println(end - start);
}
}
O(1)
。红黑树每个操作的工作量为O(lg n)
。 - Keith RandallHashMap
大约需要60毫秒,而对于TreeMap
则需要90毫秒。我会发布我的代码。 - Keith Randall这取决于你的映射中键的哈希和比较函数有多快。这取决于你更关心平均情况性能还是最坏情况性能。这取决于你是否对映射的键应用了一个好的哈希函数;哈希值应该在哈希函数的域上分布良好(是的,它可能取决于你的数据)。
一般来说(当你不想测试时),哈希映射通常是一个很好的答案,但如果你没有成千上万的条目,它也不太可能产生很大的差异(对于小尺寸,"vec map" 也可以很好地工作)。
关于迭代的意图而言,取决于:
此外,对于 put/get/remove/containsKey 的时间复杂度:
Geekforgeeks:
StackOverflow:
TreeMap
可以胜任。但您已经知道了这一点。 - RaedwaldHashMap
更快。但是LinkedHashMap
(Java 8)的Javadocs说它的迭代速度比HashMap
要快得多。因此,根据您的具体标准,可能会有所不同。除非需要排序,否则绝对不要使用TreeMap
,并使用LinkedHashMap
来保留插入顺序。 - Lambart