8

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

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

但是在 java 文档中,我发现了许多其他实现,例如TreeMap, LinkedHashMap,HashTable等。我想知道我是否可以继续盲目地使用或者这些实现之间HashMap存在任何重要差异。Map

要点的简短列表就可以了。谢谢。

4

5 回答 5

12
  • 不用管它Hashtable,它是 Java 1.0 的遗物;
  • HashMap由于 O(1) 查找和仅依赖于equals和,因此是通用默认值hashCode,保证为所有 Java 对象实现;
  • TreeMap为您提供对映射条目的排序迭代(以及更多内容—请参阅NavigableMap),但需要比较策略并且插入和查找速度较慢 - O(logN) - 比HashMap;
  • LinkedHashMap迭代条目时保留插入/访问顺序。

SortedMap实现提供了一些很棒的特性,比如headMaptailMap. NavigableMap实现为假定排序键的操作提供了更多具有出色性能的功能。

更远的地方还有java.util.concurrentmap 实现,比如ConcurrentHashMap,它们提供了出色的并发性能和原子 get/put 操作。

于 2012-12-20T14:21:00.087 回答
2
  • HashMap几乎一直使用它。请注意,您的对象需要正确实现equalshashCode方法。不保存广告订单。
  • HashTable永远不要使用它。
  • LinkedHashMap相同HashMap但保存插入顺序。开销大。
  • TreeMap支持自然排序。但是插入工作在 O(logn) 中。
于 2012-12-20T14:24:22.510 回答
2

我主要使用HashMap或者ConcurrentHashMap如果我需要它是线程安全的

于 2012-12-20T14:24:43.173 回答
1

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

于 2012-12-20T14:22:42.250 回答
0

这些 Map 实现之间的任何重要区别

是的,在选择Map.

  • 并发
    你会跨线程操作这个映射吗?
  • NULL
    你想接受还是拒绝NULL 指针作为键和/或值?
  • 排序
    您是否希望按某种顺序放置地图条目,例如排序顺序或原始插入顺序?你想支持SortedMap/NavigableMap接口吗?
  • 不可修改
    您是否希望地图被冻结,拒绝接受或删除条目?
  • Identity
    是否想根据引用相等或对象相等比较键?
  • 效率当您的密钥是枚举
    时,您想利用非常快的性能和非常少的内存吗?
  • 文字
    您想要在一行代码中方便地声明和填充地图吗?
  • 旧版
    您想避免使用在现代Java 集合框架之前创建的旧版地图吗?

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

表格比较了与 Java 11 捆绑的 <code>Map</code> 的十种实现的特性。

于 2019-12-28T23:18:18.120 回答