Hashtable

private int threshold;

阈值,超出后需要重新调整容量

threshold = (int)Math.min(initialCapacity * loadFactor, MAX_ARRAY_SIZE + 1);

threshold=initialCapacity*loadFactor

初始容量*加载因子,加载因子默认为0.75,默认初始容量为11


超出阈值调整容量:两倍加一

int newCapacity = (oldCapacity << 1) + 1;

遍历

Map<String,String> hashmap = new Hashtable<>();
//遍历
Set<Map.Entry<String,String>> entrySet= hashmap.entrySet();
for (Map.Entry<String, String> entry : entrySet) {
    entry.getKey();
    entry.getKey();
}

put方法底层

    public synchronized V put(K key, V value) {
        //value不能为null
        if (value == null) {
            throw new NullPointerException();
        }

        // Hashtable用Entry<?,?>的数组来存数据,每个键值对都是一个Entry<?,?>,其中?表示任意类型
        Entry<?,?> tab[] = table;
        //计算key的hash值
        int hash = key.hashCode();
        //根据hash值计算index
        int index = (hash & 0x7FFFFFFF) % tab.length;
        @SuppressWarnings("unchecked")
        //取得index位置的entry
        Entry<K,V> entry = (Entry<K,V>)tab[index];
        for(; entry != null ; entry = entry.next) {
            //找到相同hash值的,更新value,并返回旧的value值
            if ((entry.hash == hash) && entry.key.equals(key)) {
                V old = entry.value;
                entry.value = value;
                return old;
            }
        }
        //没找到相同hash值的,插入新的entry
        addEntry(hash, key, value, index);
        return null;
    }

其中算index时hash & 0x7FFFFFFF目的是去除负数情况,详见
https://stackoverflow.com/questions/9380670/why-does-java-use-hash-0x7fffffff-tab-length-to-decide-the-index-of-a-key
结构图
Hashtable结构图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值