Java 爪哇:地图动物园,选择什么

Java 爪哇:地图动物园,选择什么,java,map,hashmap,hashtable,linkedhashmap,Java,Map,Hashmap,Hashtable,Linkedhashmap,我对Java世界相当陌生(因为我是用C/C++编写primary)。我正在应用程序中使用地图。 因为java.util.Map是抽象的,所以我需要实例化它的实现。通常我会使用HashMap如下: Map<String, MyClass> x = new HashMap<>(); Map x=newhashmap(); 但是在java文档中,我发现了许多其他的实现,比如TreeMap,LinkedHashMap,HashTable,等等。我想知道我是否可以继续盲目地使用

我对Java世界相当陌生(因为我是用C/C++编写primary)。我正在应用程序中使用地图。 因为
java.util.Map
是抽象的,所以我需要实例化它的实现。通常我会使用
HashMap
如下:

Map<String, MyClass> x = new HashMap<>();
Map x=newhashmap();
但是在java文档中,我发现了许多其他的实现,比如
TreeMap
LinkedHashMap
HashTable
,等等。我想知道我是否可以继续盲目地使用
HashMap
,或者这些
Map
实现之间有任何重要的差异

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

  • 不要为哈希表烦恼,它是Java1.0的遗物
  • HashMap
    是通用默认值,因为O(1)查找和依赖于
    equals
    hashCode
    ,保证为所有Java对象实现
  • TreeMap
    为您提供了对映射项进行排序的迭代(还有更多内容请参见
    NavigableMap
    ),但需要比较策略,插入和查找–O(logN)–比
    HashMap
  • LinkedHashMap
    在迭代条目时保留插入/访问顺序
SortedMap
实现提供了一些很棒的功能,比如
headMap
tailMap
NavigableMap
实现为采用排序键的操作提供了更多性能优异的功能


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

当然,每个映射之间都有重要的区别。这完全取决于你想做什么。如果您回忆起一个
HashMap
,当您有一个糟糕的散列函数时,它就变得非常无用(请参阅低效)。
LinkedHashMap
是一个由双链接列表支持的
HashMap
,因此您可以对其进行迭代。当然,你会吃掉与链表相关的开销
TreeMap
将元素保持有序,因此您将消耗这些开销<代码>哈希表是一个同步的集合,通常是避免的。

  • HashMap
    几乎一直使用它。请注意,您的对象需要正确实现
    equals
    hashCode
    方法。不保存插入顺序
  • HashTable
    永远不要使用它
  • LinkedHashMap
    HashMap
    相同,但保存插入顺序。巨大的开销
  • TreeMap
    支持自然排序。但是插入在O(logn)中起作用
      • 是的线程安全版本,您不应该再使用它。相反,您应该使用线程安全映射的新实现
      • 主要用于对密钥进行排序时,它实现了接口。put/get性能为O(logn)
      • 如果需要线程安全,则使用
      • 要按插入顺序迭代键时使用
      如果需要线程安全,我通常使用
      HashMap
      ConcurrentHashMap

      这些映射实现之间有什么重要区别吗

      是的,当选择<代码> map

      时,有一些主要的不同要考虑。
      • 并发性
        您将操作此映射吗
      • NULLs
        是否接受或拒绝作为键和/或值
      • 排序
        是否希望地图条目按某种顺序排列,如排序顺序或原始插入顺序?您想要对/接口的支持吗
      • 不可修改
        是否要冻结地图,拒绝接受或删除条目
      • 标识
        是否要基于比较键
      • 效率
        当您的钥匙是一把钥匙时,您想利用非常快的性能和非常少的内存吗
      • 文字
        是否希望在一行代码中方便地声明和填充映射
      • 传统
        您想避免使用现代地图之前创建的地图吗
      下面是我制作的一个图表,比较了与Java11捆绑在一起的十个
      Map
      实现的每个特性


      你查过javadoc上的那些类了吗?那么,有一家叫做谷歌的公司……我不得不投反对票,就为了这条评论
      有太多的东西要看。我还是会读的,但现在我需要一个快速的答案,比如一个简短的差异列表
      @Isaac-sure。如果是复制品,那是我的错。感知:官方文件是所有使用该语言的人的必读读物。但再一次,我不是Java程序员,我只需要重写一小段代码。而且要快。我不想盲目地做这件事,但我没有足够的时间去阅读和(更重要的是)理解我在官方文件中读到的内容。“如果这让你伤心,我很抱歉。”maverik,请注意,我的评论是在你解释你的这种情况之前写的。从最初的外观来看,似乎你太懒了,不想做一些研究。显然,没有冒犯的意思。谢谢关于TreeMap的其他事情,它实现了SortedMap谢谢你和所有其他人。这就是我要寻找的。
      HashMap
      查找不是
      O(1)
      -这在很大程度上取决于哈希函数,在最坏的情况下是
      O(n)
      。请参阅
      get
      -@SpaceTrucker的源代码中的for循环。它还具有一个应用于对象自身的
      hashCode
      的重新灰化函数,这在很大程度上缓解了这些问题。@MarkoTopolnik它并没有改变复杂性不是