java核心基础--jdk源码分析学习--Hashtable

java.util.Hashtable

1. 内部由内部类Entry存储单节点数据,单向链表(hash冲突时往后放)。table为Entry数组,hash后决定Entry存在table[?]
private static class Entry<K,V> implements Map.Entry<K,V> {
Entry<K,V> next;
2. Hashtable初始默认容量11,可容纳11 * 0.75个节点
public Hashtable() {
    this(11, 0.75f);
}
3. get() put()都是synchronized的,区别HashMap
4. put()的key与value都不能是null
5. index为hash值, 然后判断table[index],为空直接填入,否则遍历,如果找到key相同就更新值返回原值,或遍历至表尾添加
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;//tab为table数组,tab.length为Hashtable的容量
6. rehash与扩容, rehash()发生, 当Hashtable存的数量大于容量*负载因子(默认11 * 0.75),发生扩容,为原容量2倍+1,原数据重新hash放入扩容后的table里【移动的是引用】【开销在new 新容量的table】
int newCapacity = (oldCapacity << 1) + 1; //扩容
Entry<?,?>[] newMap = new Entry<?,?>[newCapacity];  //创建新table
int index = (e.hash & 0x7FFFFFFF) % newCapacity;  //重新散列rehash
7. 较之HashMap,【Hashtable是线程安全的】初始容量不像HashMap(初始容量必须为2的次方),最好【初始化一个合适大小的Hashtable】,防止扩容开销
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值