Java基础-了解Hashtable

Hashtable和HashMap都是Map接口的实现类,方法是一样的,实现也差不多,主要说下不同

*Hashtable线程安全,HashMap非线程安全。
Hashtable主要是在各个关键操作(put、putAll、get等)加了synchronized关键字来保证线程安全。这样也导致了Hashtable效率要低些。因为n个线程都会抢一把锁,无论读或者写,抢到的线程进行操作,抢不到的只能等了。

*Hashtable不允许null值,HashMap允许

 //Hashtable的put操作
 public synchronized V put(K key, V value) {
        // Make sure the value is not null
        if (value == null) {
            throw new NullPointerException();
        }
        ...
    }

*Hashtable继承了Dictionary,HashMap则继承了AbstractMap,据说是因为历史原因(Hashtable从jdk1.0就有了,HashMap到1.2才有的)

public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable {
    ...
}
public class HashMap<K,V>
    extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable{
...
}

*数组下标bucketIndex计算方式不同

HashMap是让hash值与(length-1)进行&运算获得

static int indexFor(int h, int length) {
      return h & (length-1);
}

Hashtable是进行取余获的,前面的&运算是为了保证值为正数(如果本身就是正数,计算的结果和原本的hash值是一样的),再进行取余

index = (hash & 0x7FFFFFFF) % tab.length;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值