HashTable HashMap区别

必须掌握

线程安全性不同

HashTable 线程安全   所有public方法声明中都有synchronized关键字
HashMap   非线程安全

Further Reading :线程安全的Map

key和value是否允许null值

Hashtable   key和value都不允许出现null值。
HashMap     key和value都允许null,但是put(null,null)编译可以通过,运行时会NullPointerException异常,这是JDK的规范规定的。

内部实现使用的数组初始化和扩容方式不同

HashTable  默认容量为11
HashMap    默认容量为16

Hashtable  扩容时,将容量变为原来的2倍加1
HashMap    扩容时,将容量变为原来的2

是否提供contains方法

Hashtable 保留了contains,containsValue,containsKey三个方法,其中contains和containsValue功能相同
HashMap   去掉了contains方法,保留了containsValue和containsKey,因为contains方法容易让人引起误解

两个遍历方式的内部实现上不同

HashtableHashMap都使用了Iterator。而由于历史原因,Hashtable还使用了 Enumeration 的方式 。

了解即可

继承的父类不同

Hashtable<K,V>
	    extends Dictionary<K,V>
	    implements Map<K,V>, Cloneable, java.io.Serializable 

class HashMap<K,V> 
		extends AbstractMap<K,V>
	    implements Map<K,V>, Cloneable, Serializable {

hash值不同

Hashtable 不重新计算hash值,直接用key的hashCode()
HashMap   重新计算了key的hash值。
	
Hashtable 在求hash值对应的位置索引时,用取模运算,
HashMap   在求位置索引时,则用与运算,且这里一般先用hash&0x7FFFFFFF后,再对length取模,&0x7FFFFFFF的目的是为了将负的hash值转化为正值,因为hash值有可能为负数,而&0x7FFFFFFF后,只有符号外改变,而后面的位都不变。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值