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