一:选手入场:
首先介绍这两个PK对象的区别:
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方法确实太像。
二:比赛开始:
比较优缺点:
1:效率:由于Hashtabe是线程同步的,当大量的并发访问的时候,速度肯定要比HashMap慢的多,当然这个的前提是:我们的程序不需要保证线程同步。
也就是说在不需要保证线程同步的情况下:我们应该选择Hashmap。暂时Hashmap对Hashtable的比分是:1:0。
大多数的应用是需要保证线程安全的:这个时候好像Hashtable先天有优势,但HashMap使用上面(区别:2)的方法一样可以保证线程安全,在这种情况下天才和后天努力者的对决好像势均力敌,难分高下,现在的比分是2:1。
2:空间:Hashtable的初始容量为11,而HashMap初始化容量为16.并且他们的加载因子默认都为0.75。前者的增加方式是 old*2+1;后者为old*2;也就是说当Hashtable中存在8个键值时,它的容量会自动增加到23.而HashMap中存在12个键值时,它会增加容量到32。
这样看来,一个是基数小增加快,一个是基数大增加慢。比拼结果还是难分高下:3:2。
3:人品:时间和空间上比完就要比人品了。Sun的jdk不断更新,很多的类与方法不断的被重写和淘汰,显然后生的要比早生的先进,所以java官方还是支持HashMap的。像Dictionary也早已注明“已过时,建议使用Map接口”。当然Hashtable线程同步的优点还是比较突出的(例如属性文件),觉类似于HashMap的一个子类。结果:4:2。
三:最后结果:
HashMap在与Hashtable的较量中胜出