`
qiushyfm
  • 浏览: 95878 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

HashMap VS Hashtable

阅读更多

一:选手入场

首先介绍这两个PK对象的区别:

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

2:最重要的区别:Hashtable是线程同步的,而HashMap是线程不同步的。也就是说当我们的应用处于多个线程访问时,Hashtable是安全的,而HashMap要通过额外的同步机制:一般Collections的一个静态方法得到解决: 

Map m = Collections.synchronizedMap(new HashMap(...));

这个方法返回一个同步的Map,这个Map封装了底层的HashMap的所有方法,使得底层的HashMap即使是在多线程的环境中也是安全的。

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

当需要判断是否存在某个键映射一个值时:HashMap去掉了HashtablecontainsObject value)方法,保留了containsValueObject value)和containsKeyObject key)方法,因为containscontainsValue方法确实太像。

 

 

二:比赛开始:

比较优缺点:

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

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

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

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

这样看来,一个是基数小增加快,一个是基数大增加慢。比拼结果还是难分高下:32

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

 

三:最后结果:

HashMap在Hashtable的较量中胜出!

4
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics