linkedhashmap,hashmap,map,hashtable之间的区别

Amm*_*kun 2 java collections

我正准备进行软件访谈,现在我几天都遇到了问题.

我无法弄清楚Java Collection API中存在的linkedhashmap,map,hashtable和hashmap之间的区别.

所有这些都具有相同的获取和复杂性吗?我知道map是接口类和hashmap,hashtable,linkedhashmap实现这个接口.那么这是否意味着这三个类的内部实现是一样的?它们是如何在集合api中实现的?

提前致谢!!!

Wal*_*inz 13

我怀疑这些差异可以比这些类中已经在JavaDocs中编写的内容更好地解释:

  • Map是所有这些类共有的基本接口
  • 一个Hashtable的是一个实现该接口的,因为当它被认为拥有一切同步是一个好主意(参见"老字号"天矢量).如果您知道自己在做什么,它会提供"一种"线程安全性.如果你认真对待可以从多个线程使用的地图,你应该绝对检查ConcurrentHashMapConcurrentSkipListMap.
  • 一个HashMap中是几乎相同哈希表,但与同步去除.它是首选的通用Map实现.
  • 一个LinkedHashMap的额外维护它的条目,这使得维持排序或轻松地使用它作为一个LRU缓存,刚读的JavaDoc的链表.

所有上述Map实现都具有(摊销的)O(1)时间复杂度的基本get/put操作.在处理null值方面存在细微差别,检查JavaDoc的细节是不可避免的.

要了解这些类是如何实现的,请查看它们的继承树:

  • Map (只是界面)
    • Dictionary (废弃的抽象类)
      • Hashtable ("旧的"地图实现依赖于它)
    • AbstractMap ("新"地图实现的基本功能)
      • HashMap (第一个用于通用目的的具体地图实施)
        • LinkedHashMap(HashMap通过维护链表扩展)

  • @Amm,在简单的情况下是的,但是[`HashMap`已在Java4中重新实现](http://www.javaspecialists.eu/archive/Issue054.html),以使用更棘手的算法,该算法要求映射大小总是 2 的幂。 (2认同)

ste*_*vls 7

他们都遵守同样的合同,但在实施方面存在一些差异:

  • LinkedHashMap:按插入顺序维护键
  • HashTable:所有操作都是同步的,没有订购保证
  • HashMap:没有订购保证,性能最佳

通常,最佳实践是使用Map变量的类型,然后根据代码的需要实例化实现类型. HashMap通常是首选,除非您需要一些订购保证,在这种情况下LinkedHashMap或是TreeMap很好的选择.