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

时间:2011-06-17 07:46:38

标签: java collections

我正准备进行软件访谈,现在我几乎被问了几个问题。

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

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

提前致谢!!!

3 个答案:

答案 0 :(得分:13)

我怀疑这些差异可以解释得比已经在JavaDocs中为这些类写的更好:

  • Map是所有这些类共有的基本界面
  • a Hashtable是该界面的一个实现,因为人们认为让所有内容同步是一个好主意(参考Vector)。如果您知道自己在做什么,它会提供“一种”线程安全性。如果您认真考虑可以在多个线程中使用的地图,那么您应该绝对查看ConcurrentHashMapConcurrentSkipListMap
  • a HashMap与Hashtable几乎相同,但删除了同步。它是首选的通用Map实现。
  • 一个LinkedHashMap另外维护一个条目的链接列表,它允许维护一个排序或轻松地将它用作LRU缓存,只需阅读JavaDoc。

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

要了解这些类的实现方式,请查看它们的继承树:

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

答案 1 :(得分:7)

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

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

通常,最佳做法是使用Map作为变量的类型,然后根据代码的需要实例化实现类型。除非您需要一些排序保证,否则HashMap通常是首选,在这种情况下,LinkedHashMapTreeMap是不错的选择。

答案 2 :(得分:0)

所有类都实现了Map接口,并提供了大部分相同的功能。最重要的区别在于迭代条目的顺序:

HashMap绝对不保证迭代顺序。当添加新元素时,它甚至可以(并且将)完全改变。 TreeMap将根据"自然排序"迭代。根据compareTo()方法(或外部提供的Comparator)的键。此外,它还实现了SortedMap接口,该接口包含依赖于此排序顺序的方法。 LinkedHashMap将按照条目放入地图的顺序进行迭代 "哈希表"是基于散列的映射的通用名称。在Java API的上下文中,Hashtable是Java 1.1之前的一个过时类,它存在于集合框架之前。它不应再被使用,因为它的API混杂了复制功能的过时方法,并且它的方法是同步的(这可能会降低性能并且通常是无用的)。使用ConcurrrentHashMap而不是Hashtable。