[英]difference between linkedhashmap, hashmap, map, hashtable
我正准备进行软件访谈,现在我几天都遇到了问题。
我无法弄清楚Java Collection API中存在的linkedhashmap,map,hashtable和hashmap之间的区别。
所有这些都具有相同的获取和复杂性吗? 我知道map是接口类和hashmap,hashtable,linkedhashmap实现这个接口。 那么这是否意味着这三个类的内部实现是一样的? 它们是如何在集合api中实现的?
提前致谢!!!
我怀疑这些差异可以比这些类中已经在JavaDocs中编写的内容更好地解释:
ConcurrentHashMap
和ConcurrentSkipListMap
。 所有上述Map
实现都具有(摊销的) O(1)时间复杂度的基本get / put操作。 处理null
值时存在细微差别,因此不可避免地要检查JavaDoc的详细信息。
要了解这些类是如何实现的,请查看它们的继承树:
Map
(只是界面)
Dictionary
(废弃的抽象类)
Hashtable
(“旧”地图实现依赖于它自己) AbstractMap
(“新”地图实现的基本功能)
HashMap
(第一个用于通用目的的具体地图实现)
LinkedHashMap
(通过维护链表扩展HashMap
) 他们都遵守同样的合同,但在实施方面存在一些差异:
通常,最佳实践是使用Map
作为变量的类型,然后根据代码的需要实例化实现类型。 除非您需要一些排序保证,否则HashMap
通常是首选,在这种情况下LinkedHashMap
或TreeMap
是不错的选择。
所有类都实现了Map接口,并提供了大部分相同的功能。 最重要的区别是条目的迭代顺序:
HashMap绝对不保证迭代顺序。 当添加新元素时,它甚至可以(并且将)完全改变。 TreeMap将根据其compareTo()方法(或外部提供的Comparator)根据键的“自然排序”进行迭代。 此外,它还实现了SortedMap接口,该接口包含依赖于此排序顺序的方法。 LinkedHashMap将按照将条目放入映射的顺序进行迭代“Hashtable”是基于散列的映射的通用名称。 在Java API的上下文中,Hashtable是Java 1.1之前的一个过时类,它存在于集合框架之前。 它不应再被使用,因为它的API混杂了复制功能的过时方法,并且它的方法是同步的(这可能会降低性能并且通常是无用的)。 使用ConcurrrentHashMap而不是Hashtable。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.