HashtTable源码解读

本文详细探讨了HashTable与HashMap的内部实现机制,包括两者的主要区别、哈希算法、容量调整等核心内容。此外,还对比了它们在多线程环境下的表现及应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

每一次打击都是为了更好的提高,加油!

hashTable默认情况下大小为11。

int index = (hash & 0x7FFFFFFF) % tab.length; hashtable,为什么???

因为:

  • 0x7FFFFFFF 是0111 1111 1111 1111 1111 1111 1111 1111:除符号位外的所有1。

  • (hash & 0x7FFFFFFF) 将产生正整数。

  • (hash & 0x7FFFFFFF) % tab.length 将在标签长度的范围内。

所有hashtable采用奇数导致的hash冲突会比较少,采用偶数会导致的冲突会增多。
h & (length-1); hashmap采用相与的方法,所有采用2的幂次方的长度会导致的冲突比较少。

put
不允许value值为null.
if (value == null) {
    throw new NullPointerException();

}

是先扩容在添加,而hashmap先添加再扩容

rehash
int newCapacity = oldCapacity * 2 + 1;

hashtable线程遍历是非线程安全的。安全方法参见:

 

 四、HashTable与HashMap的区别

        HashTable和HashMap存在很多的相同点,但是他们还是有几个比较重要的不同点。

        第一:我们从他们的定义就可以看出他们的不同,HashTable基于Dictionary类,而HashMap是基于AbstractMap。Dictionary是什么?它是任何可将键映射到相应值的类的抽象父类,而AbstractMap是基于Map接口的骨干实现,它以最大限度地减少实现此接口所需的工作。

        第二:HashMap可以允许存在一个为null的key和任意个为null的value,但是HashTable中的key和value都不允许为null。如下:

        当HashMap遇到为null的key时,它会调用putForNullKey方法来进行处理。对于value没有进行任何处理,只要是对象都可以。

注意:看jdk源码只有不允许value为null。

 

 

 

  1. if (key == null)

  2. return putForNullKey(value);

        而当HashTable遇到null时,他会直接抛出NullPointerException异常信息。

 

 
  1. if (value == null) {

  2. throw new NullPointerException();

  3. }

        第三:Hashtable的方法是同步的,而HashMap的方法不是。所以有人一般都建议如果是涉及到多线程同步时采用HashTable,没有涉及就采用HashMap,但是在Collections类中存在一个静态方法:synchronizedMap(),该方法创建了一个线程安全的Map对象,并把它作为一个封装的对象来返回,所以通过Collections类的synchronizedMap方法是可以我们你同步访问潜在的HashMap。这样君该如何选择呢???

参考文章:https://blog.csdn.net/chenssy/article/details/22896871

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值