影响hashMap性能的因素

Capacityhash表里bucket的数量

Initial capacity:创建hash表的时 bucket的数量 java使用2的整数次方,对处理器来说,除法和取模是最慢的两种操作,所以如果hash表长度是2的整数次方,就能用掩码代替除法。)

Size 当前表的数量

Load factorsize/ capacity   负载教轻的表会有较少的冲突,因此插入和查找速度会比较快

load factor达到阀值,容器会自动将capacity增大一倍,然后将现有的对象分配到新bucketrehash 缺省会用0.75load factor

好的hashCode()应该能生成均匀分布的值

 

HashMapput

    public V put(K key, V value) {

        if (key == null)

            return putForNullKey(value);

        int hash = hash(key.hashCode()); //根据keyhashcodehash一下(为了抵御"某些不良设计的hashCode函数")

        int i = indexFor(hash, table.length);//根据hash值和当前表的长度与运算一下,indexFor这个函数返回的是hash值在table中的位置

        for (Entry<K,V> e = table[i]; e != null; e = e.next) {

            Object k;

//hash值相同,key也相同的时候,把旧的值用新值替换,并返回旧的值

            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {

                V oldValue = e.value;

                e.value = value;

                e.recordAccess(this);

                return oldValue;

            }

        }

 

        modCount++;

//相同的hash 不同的key,该值将放在当前table[i],Entry.next指向之前的entry

        addEntry(hash, key, value, i);

        return null;

    }

Get方法

public V get(Object key) {

        if (key == null)

            return getForNullKey();

        int hash = hash(key.hashCode());//先根据keyhashcodehash一下

        for (Entry<K,V> e = table[indexFor(hash, table.length)];

             e != null;

             e = e.next) {

            Object k;

            if (e.hash == hash && ((k = e.key) == key || key.equals(k)))

                return e.value;

        }//找到index对应的entry,比较entryhash值,hash值一样,比较keyKey一样的话才返回。

        return null;

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值