hashtable 和 hashmap的区别与联系

1、相同点:两者都是对于接口java.util.Map的实现类;都是用来存储健值的数据结构。

2、区别:
(1)hashmap允许键值为空(key=null),但最多值允许一条记录的简直为空。hashtable不允许。

(2)hashmap不支持线程同步,不是线程安全的,hashtable是线程安全的。

原因:1、HashMap底层是一个Entry数组,一旦发生Hash冲突的的时候,HashMap采用拉链法解决碰撞冲突,Entry内部的变量。

 通过Entry内部的next变量可以知道使用的是链表,这时候我们可以知道,如果多个线程,在某一时刻同时操作HashMap并执行put操作,而有大于两个key的hash值相同,如图中a1、a2,这个时候需要解决碰撞冲突,而解决冲突的办法上面已经说过,对于链表的结构在这里不再赘述,暂且不讨论是从链表头部插入还是从尾部初入,这个时候两个线程如果恰好都取到了对应位置的头结点e1,而最终的结果可想而知,a1、a2两个数据中势必会有一个会丢失,如图所示:

 

2、扩容方法也不是同步的,通过代码我们知道在扩容过程中,会新生成一个新的容量的数组,然后对原数组的所有键值对重新进行计算和写入新的数组,之后指向新生成的数组。

(3)hash值的使用不同:hashmap计算的hash值,会进行按位与操作;hashtable直接使用hashcode()计算的hash值。

(4)hash数组大小和扩容不同:hashmap中,hash数组的默认大小是16,而且一定是2的倍数;hashtable中,hash数组默认大小是11,增加方式是old*2+1.

(5)判断是否包含某个值的时候方法不同:hashmap继承自父类AbstractMap,hashtable继承自父类Dictionary; HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey。

(6)hashmap使用Iterator,hashtable使用Enumeration。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值