我正准备进行软件访谈,现在我几天都遇到了问题 .
我无法弄清楚Java Collection API中存在的linkedhashmap,map,hashtable和hashmap之间的区别 .
所有这些都具有相同的获得和复杂性吗?我知道map是接口类和hashmap,hashtable,linkedhashmap实现这个接口 . 那么这是否意味着这三个类的内部实现是一样的?它们是如何在集合api中实现的?
提前致谢!!!
我怀疑这些差异可以解释为比JavaDocs为这些类编写的内容更好:
Map是所有这些类共有的基本接口
a Hashtable是该接口的一个实现,对于"old"天,当时认为让所有内容同步是个好主意(参考文献Vector) . 如果你知道你在做什么,它提供"kind of"线程安全 . 如果你认真对待可以从多个线程使用的 Map ,你应该绝对检查ConcurrentHashMap和ConcurrentSkipListMap .
a HashMap与Hashtable几乎相同,但删除了同步 . 它是首选的通用Map实现 .
a LinkedHashMap另外维护了它的条目的链接列表,它允许维护一个排序或轻松地将它用作LRU缓存,只需读取JavaDoc .
所有上述 Map 实现都具有(摊销的)O(1)时间复杂度的基本get / put操作 . null 值的处理存在细微差别,检查JavaDoc的细节是不可避免的 .
Map
null
要了解这些类是如何实现的,请查看它们的继承树:
Map (只是界面)
Dictionary (废弃的抽象类)
Dictionary
Hashtable ("old" Map 实现依赖于它自己)
Hashtable
AbstractMap ("new" Map 实现的基本功能)
AbstractMap
HashMap (第一个用于通用目的的具体 Map 实施)
HashMap
LinkedHashMap (通过维护链表扩展 HashMap )
LinkedHashMap
他们都遵守同样的 Contract ,但在实施方面存在一些差异:
LinkedHashMap:按插入顺序维护键
HashTable:所有操作都是同步的,没有排序保证
HashMap:没有订购保证,性能最佳
通常,最佳做法是使用 Map 作为变量的类型,然后根据代码的需要实例化实现类型 . HashMap 通常是首选,除非您需要一些订购保证,在这种情况下 LinkedHashMap 或 TreeMap 是不错的选择 .
TreeMap
所有类都实现了Map接口,并提供了大部分相同的功能 . 最重要的区别是条目的迭代顺序:
HashMap绝对不保证迭代顺序 . 当添加新元素时,它甚至可以(并且将)完全改变 . TreeMap将根据其compareTo()方法(或外部提供的Comparator)根据键的“自然排序”进行迭代 . 此外,它还实现了SortedMap接口,该接口包含依赖于此排序顺序的方法 . LinkedHashMap将按照条目放入映射的顺序进行迭代“Hashtable”是基于散列的映射的通用名称 . 在Java API的上下文中,Hashtable是Java 1.1之前的一个过时类,它存在于集合框架之前 . 它不应再被使用,因为它的API混杂着复制功能的过时方法,并且它的方法是同步的(这会降低性能并且通常是无用的) . 使用ConcurrrentHashMap而不是Hashtable .
3 回答
我怀疑这些差异可以解释为比JavaDocs为这些类编写的内容更好:
Map是所有这些类共有的基本接口
a Hashtable是该接口的一个实现,对于"old"天,当时认为让所有内容同步是个好主意(参考文献Vector) . 如果你知道你在做什么,它提供"kind of"线程安全 . 如果你认真对待可以从多个线程使用的 Map ,你应该绝对检查ConcurrentHashMap和ConcurrentSkipListMap .
a HashMap与Hashtable几乎相同,但删除了同步 . 它是首选的通用Map实现 .
a LinkedHashMap另外维护了它的条目的链接列表,它允许维护一个排序或轻松地将它用作LRU缓存,只需读取JavaDoc .
所有上述
Map
实现都具有(摊销的)O(1)时间复杂度的基本get / put操作 .null
值的处理存在细微差别,检查JavaDoc的细节是不可避免的 .要了解这些类是如何实现的,请查看它们的继承树:
Map
(只是界面)Dictionary
(废弃的抽象类)Hashtable
("old" Map 实现依赖于它自己)AbstractMap
("new" Map 实现的基本功能)HashMap
(第一个用于通用目的的具体 Map 实施)LinkedHashMap
(通过维护链表扩展HashMap
)他们都遵守同样的 Contract ,但在实施方面存在一些差异:
LinkedHashMap:按插入顺序维护键
HashTable:所有操作都是同步的,没有排序保证
HashMap:没有订购保证,性能最佳
通常,最佳做法是使用
Map
作为变量的类型,然后根据代码的需要实例化实现类型 .HashMap
通常是首选,除非您需要一些订购保证,在这种情况下LinkedHashMap
或TreeMap
是不错的选择 .所有类都实现了Map接口,并提供了大部分相同的功能 . 最重要的区别是条目的迭代顺序:
HashMap绝对不保证迭代顺序 . 当添加新元素时,它甚至可以(并且将)完全改变 . TreeMap将根据其compareTo()方法(或外部提供的Comparator)根据键的“自然排序”进行迭代 . 此外,它还实现了SortedMap接口,该接口包含依赖于此排序顺序的方法 . LinkedHashMap将按照条目放入映射的顺序进行迭代“Hashtable”是基于散列的映射的通用名称 . 在Java API的上下文中,Hashtable是Java 1.1之前的一个过时类,它存在于集合框架之前 . 它不应再被使用,因为它的API混杂着复制功能的过时方法,并且它的方法是同步的(这会降低性能并且通常是无用的) . 使用ConcurrrentHashMap而不是Hashtable .