【问题标题】:Performance of TreeMap, HashMap and LinkedHashMap?TreeMap、HashMap和LinkedHashMap的性能?
【发布时间】:2012-05-13 15:22:40
【问题描述】:

在 TreeMap 中 - 元素已排序
在 HashMap 中 - 元素未排序

那么,如果我考虑getputremove 方法,我应该使用哪个映射来提高性能?

【问题讨论】:

  • 参见 Javadoc。 HashMap 被指定为 O(1):'基本操作(get 和 put)的恒定时间性能,假设散列函数将元素正确地分散在桶中'。 TreeMap 被指定为“保证 containsKeygetputremove 操作的 log(n) 时间成本。
  • 在不知道您评估哪个选项更好的标准的情况下,不可能回答这个问题。显然,如果您需要排序集合,则只有 TreeMap 可以。但你已经知道了。
  • 接受的答案是HashMap 更快。但是LinkedHashMap (Java 8) 的 Javadocs 说它的迭代速度比HashMap 快得多。所以 YMMV,取决于您的具体标准。除非您需要排序,否则绝对不要使用TreeMap,并使用LinkedHashMap 来保留插入顺序。

标签: java performance map


【解决方案1】:

除非您需要订购,否则请使用HashMapHashMap 更快。

也就是说,您可以通过使用通用接口作为声明来轻松切换:

 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);
  }
}

【讨论】:

  • @keith-你能告诉我,hashmap 比 treemap 快吗?树形图按顺序访问键上的值。你能告诉我hashmap是如何工作的吗??
  • 答案比此评论中的要长。学习数据结构课程,或阅读 Wikipedia 上的哈希表和红黑树。哈希表是O(1) 每个操作的摊销工作,假设一个好的哈希函数。红黑树是O(lg n) 每个操作的工作量。
  • 我已经尝试了treemap和hashmap的示例......我在地图中输入了100000个条目并访问它们..我计算了时间。但是我的程序的结果是 treemap-187 hashmap 206 意味着 hashmap 需要更多时间...感到困惑,请解释一下您对此有何看法?
  • 我没有得到相同的结果。将 100000 个条目放入映射中,HashMap 需要大约 60 毫秒,TreeMap 需要 90 毫秒。我会发布我的代码。
  • 好的,您尝试过同时使用顺序号和非顺序号吗?
【解决方案2】:

这取决于哈希和比较函数在地图中的键上的速度。这取决于您是对平均情况下的性能还是最坏情况下的性能更感兴趣。这取决于您是否对地图的键应用了良好的散列函数;哈希值应该在哈希函数的域中很好地分布(是的,它可以取决于您的数据)。

一般来说(当您懒得测试时),哈希映射通常是一个很好的答案,但如果您没有数千个条目(对于小尺寸, “vec map”也可以很好地工作)。

【讨论】:

    【解决方案3】:

    就迭代而言,这取决于您的意图:

    • HashMap 不保证这种情况,这意味着它是随机的;
    • TreeMap 使用自然顺序或 Comparator(如果指定);
    • LinkedHashMap 根据插入顺序进行迭代。

    此外,对于 put/get/remove/containsKey 的 TimeComplexity:

    • HashSet - O(1);
    • TreeMap - O(log(n)) 或 O(1); -- 查看参考资料!
    • LinkedHashSet - O(1)。

    极客们:

    堆栈溢出:

    【讨论】:

    • 您的所有参考资料都建议 TreeMap 使用 O(log n)。 O(1) 从何而来?
    猜你喜欢
    • 2011-02-22
    • 2019-02-16
    • 2013-08-12
    • 1970-01-01
    • 2013-07-28
    • 2018-05-01
    • 1970-01-01
    • 2019-06-12
    • 2012-10-11
    相关资源
    最近更新 更多