hashMap源码 原理 操作 设计

散列函数

hashCode是key自身产生的,HashMap仅对其进行二次加工;

二次加工包括 h = h^(h>>>16)  以及 index = h&(size - 1)

这里 注意 hashMap的hash表大小是从2的幂开始,每次扩容都乘以2,故size始终是2的幂。故h&(size-1)其实就是 h%size;

hashCode()

String的hashCode在第一次被调用后将被缓存起来。可以容易的看出,String的hashCode就是一个 31的多项式 长度为3的字符串最终结果形如 31^2 * v[2]+ 31 * v[1] + v[0]


    /** Cache the hash code for the string */
    private int hash; // Default to 0

public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;

            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }

 switch case 操作符

switch对非整形的支持也是依靠其hashCode将非整形转为整形才能做到

 

posted @ 2022-08-19 14:28  向金华  阅读(17)  评论(0)    收藏  举报