`
380071587
  • 浏览: 448557 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Hashtable与hashmap 比较

 
阅读更多

在面试的时候,如果面试官问道集合,这两个大师绝对是少不了的,当然这个也是看你对基础的掌握是否透彻

一:选手介绍:

面试官让你说说他们二者的区别其实就是让你介绍一把而已

1:Hashtable继承自Dictionary类,而HashMap是Map接口的一个实现。这里要说明一下Dictionary类是jdk1.0中就有的,而Map接口是1.2之后才有的,当然与此同时Hashtable也实现了Map接口。

2:最重要的区别:Hashtable是线程安全的,而HashMap是线程不安全的。也就是说当我们的应用处于多个线程访问时,Hashtable是安全的,而HashMap要实现同步则要通过额外的同步机制:一般Collections的一个静态方法得到解决:Map m = Collections.synchronizedMap(new HashMap(...));这个方法返回一个同步的Map,这个Map封装了底层的HashMap的所有方法,使得底层的HashMap即使是在多线程的环境中也是安全的。

3:HashMap可以用null做为键(当然只能有一个),还可以有多个null的值,而Hashtable不可以存在null的键值。

当需要判断是否存在某个键映射一个值时:HashMap去掉了Hashtable的contains(Object value)方法,保留了containsValue(Object value)和containsKey(Object key)方法,因为contains和containsValue方法确实太像。

注:

get(Object key) 返回与指定键关联的值;

containsKey(Object key) 如果Map包含指定键的隐射,则返回true;

containsValue(Object value) 如果Map将一个或多个键隐射到指定值,则返回true;

isEmpty()如果Map不包含键-值隐射,则返回true;

二:优缺点比较:

这个说透彻很重要

1:效率:由于Hashtabe是线程安全的,当大量的并发访问的时候,速度肯定要比HashMap慢的多,当然这个的前提是:我们的程序不需要保证线程安全(同步)。

也就是说在不需要保证线程同步的情况下:我们应该选择Hashmap。

大多数的应用是需要保证线程安全的:这个时候好像Hashtable先天有优势,但HashMap使用上面(区别:2)的方法一样可以保证线程安全,在这种情况下天才和后天努力者的对决好像势均力敌,难分高下,两者都可以选择。

2:空间:Hashtable的初始容量为11,而HashMap初始化容量为16.并且他们的加载因子默认都为0.75。前者的增加方式是 old*2+1;后者为old*2;也就是说当Hashtable中存在8个键值时,它的容量会自动增加到23.而HashMap中存在12个键值时,它会增加容量到32。

这样看来,一个是基数小增加快,一个是基数大增加慢。两者都可以选择。

3:官方建议:Sun的jdk不断更新,很多的类与方法不断的被重写和淘汰,显然后生的要比早生的先进,所以java官方还是支持HashMap的。像Dictionary也早已注明“已过时,建议使用Map接口”。当然Hashtable线程同步的优点还是比较突出的(例如属性文件),觉类似于HashMap的一个子类。

三:最后建议:

最后给出自己的结论

HashMap在与Hashtable的较量中胜出

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics