【问题标题】:java: maps zoo, what to choosejava:地图动物园,选择什么
【发布时间】:2012-12-08 02:06:34
【问题描述】:

我对 Java 世界很陌生(因为我主要使用 C/C++ 编写)。我在我的应用程序中使用地图。 由于java.util.Map 是抽象的,我需要实例化它的实现。通常我使用HashMap 喜欢:

Map<String, MyClass> x = new HashMap<>();

但在 java 文档中我发现了许多其他实现,例如 TreeMapLinkedHashMapHashTable 等。我想知道我是否可以继续盲目使用 HashMap 或有任何 Map 实现之间的重要区别。

要点的简要清单就可以了。 谢谢。

【问题讨论】:

  • 你检查过这些类的javadoc吗?
  • 那么,这家公司叫谷歌……
  • 我不得不投反对票,只为这条评论There are too much to read. I'll read it anyway, but for now I need a quick answer like a brief list of difference
  • @Isaac 当然。如果它是重复的,那是我的错。认知:官方文档对于所有使用该语言的人来说都是必读。但再一次,我不是 Java 程序员,我只需要重写一小段代码。并快速完成。我不想盲目地这样做,但没有足够的时间正确地阅读和(更重要的是)了解我在官方文档中阅读的内容。如果这让您难过,我很抱歉。
  • @maverik,请注意,我的评论是在您解释您的这种情况之前写的。从最初的外观来看,似乎您懒得做一些研究。显然没有冒犯的意思。干杯

标签: java map hashmap hashtable linkedhashmap


【解决方案1】:
  • 不要理会Hashtable,它是Java 1.0 的遗物;
  • HashMap 是通用默认值,因为 O(1) 查找并且仅依赖于 equalshashCode,保证为所有 Java 对象实现;
  • TreeMap 为您提供了对映射条目的排序迭代(还有更多——请参阅 NavigableMap),但需要比较策略并且插入和查找速度较慢 - O(logN) - 比 HashMap 慢;
  • LinkedHashMap 在遍历条目时保留插入/访问顺序。

SortedMap 实现提供了一些很棒的功能,例如headMaptailMapNavigableMap 实现为假定排序键的操作提供了更多功能和出色的性能。

还有java.util.concurrent 映射实现,例如ConcurrentHashMap,它提供了出色的并发性能和原子get/put 操作。

【讨论】:

  • 关于TreeMap的另一件事,它实现了SortedMap
  • 谢谢你和所有其他人。这就是我要找的。​​span>
  • HashMap 查找不是O(1) - 这在很大程度上取决于散列函数,在最坏的情况下是O(n)。请参阅get - hg.openjdk.java.net/jdk6/jdk6/jdk/file/a42d6999734b/src/share/… 的源代码中的 for 循环
  • @SpaceTrucker 它还具有应用于对象自己的hashCode 的重新散列函数,这在很大程度上缓解了这些问题。
  • @MarkoTopolnik 它并没有改变复杂性不是 O(1) 的事实。
【解决方案2】:
  • HashMap 几乎一直在使用它。请注意,您的对象需要正确实现 equalshashCode 方法。不保存广告订单。
  • HashTable 永远不要使用它。
  • LinkedHashMapHashMap 相同,但保存插入顺序。开销大。
  • TreeMap 支持自然排序。但是插入在 O(logn) 中有效。

【讨论】:

    【解决方案3】:

    如果我需要它是线程安全的,我主要使用HashMapConcurrentHashMap

    【讨论】:

      【解决方案4】:

      当然,每张地图之间都存在重要差异。这完全取决于你想要做什么。如果您回想 HashMap 当您的散列函数较差时变得非常无用(请参阅低效)。 LinkedHashMap 是一个由双向链表支持的HashMap,因此您可以对其进行迭代。当然,您会吃掉与链表相关的开销。 TreeMap 保持元素有序,所以你会吃掉这些开销。 HashTable 是一个同步集合,一般会避免使用。

      【讨论】:

        【解决方案5】:

        这些 Map 实现之间有什么重要区别

        是的,在选择 Map 的实现时需要考虑一些主要差异。

        • 并发
          你会操纵这张地图across threads吗?
        • NULLs
          您要接受还是拒绝 NULL pointers 作为键和/或值?
        • 排序
          您是否希望按某种顺序放置地图条目,例如排序顺序或原始插入顺序?您想要支持SortedMap/NavigableMap 接口吗?
        • 不可修改
          您想冻结地图,拒绝接受或删除条目吗?
        • 身份
          想要比较基于reference-equality or object-equality 的键吗?
        • 效率
          当您的密钥是 enum 时,您想利用非常快的性能和极少的内存吗?
        • 文字
          您希望在一行代码中方便地声明地图吗?
        • 旧版
          您要避免使用在现代 Java Collections Framework 之前创建的 legacy 地图吗?

        这是我制作的图表,比较了与 Java 11 捆绑的十个 Map 实现中的每一个的特性。

        【讨论】:

          猜你喜欢
          • 2012-06-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-18
          • 1970-01-01
          • 1970-01-01
          • 2018-02-05
          相关资源
          最近更新 更多