HashTable剖析

HashMap和HashTable非常类似
阅读前先阅读《HashMap剖析》

一、结构

HashTable和HashMap结构一样都由数组和链表两种数据结构组成

二、初始化

HashTable的容量和加载因子默认为11和0.75

public Hashtable() {
    this(11, 0.75f);
}

和HashMap的区别:
HashTable没有强制把容量转换为2的整数次幂

public Hashtable(int initialCapacity, float loadFactor) {
    ...    
    this.loadFactor = loadFactor;
    //没有将initialCapacity转换为2的整数次幂
    table = new Entry<?,?>[initialCapacity];
    threshold = (int)Math.min(initialCapacity * loadFactor, MAX_ARRAY_SIZE + 1);
}

三、put(key,value)

看一下HashTable put函数的源码

public synchronized V put(K key, V value) {
        ......
        Entry<?,?> tab[] = table;
        int hash = key.hashCode();
        //计算bucketIndex的逻辑
        int index = (hash & 0x7FFFFFFF) % tab.length;
        @SuppressWarnings("unchecked")
        Entry<K,V> entry = (Entry<K,V>)tab[index];
        for(; entry != null ; entry = entry.next) {
            //判断Key是否一样的逻辑
            if ((entry.hash == hash) && entry.key.equals(key)) {
                V old = entry.value;
                entry.value = value;
                return old;
            }
        }

        addEntry(hash, key, value, index);
        return null;
    }

和HashMap的区别:

1.函数是synchronized的所以是同步的,不过这种整个函数同步的方式效率很低
2.HashTable计算bucketIndex的逻辑为
int index = (hash & 0x7FFFFFFF) % tab.length;

java中int占4字节所以0x7FFFFFFF为int的最大值
所以逻辑为:
确保hash值为int的最大范围以内的情况下对 tab.length取余,这里要注意length没有跟HashMap一样限定为2的整数次幂所以跟HashMap比,摆放不够均匀,发生碰撞的概率更大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值