共同学习Java源代码-数据结构-HashMap(三)

    static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);

    }

计算hash值的方法,接收一个Object参数key,key如果为空就返回0,否则返回key的hashCode方法与key的hashCode向右移16位的异或值。


    static Class<?> comparableClassFor(Object x) {
        if (x instanceof Comparable) {
            Class<?> c; Type[] ts, as; Type t; ParameterizedType p;
            if ((c = x.getClass()) == String.class) // bypass checks
                return c;
            if ((ts = c.getGenericInterfaces()) != null) {
                for (int i = 0; i < ts.length; ++i) {
                    if (((t = ts[i]) instanceof ParameterizedType) &&
                        ((p = (ParameterizedType)t).getRawType() ==
                         Comparable.class) &&
                        (as = p.getActualTypeArguments()) != null &&
                        as.length == 1 && as[0] == c) // type arg is c
                        return c;
                }
            }
        }
        return null;
    }

这个方法

首先判断参数x是不是实现了Comparable接口。

然后创建临时变量Class类型的c,Type数组ts和as,Type类型的t和ParameterizedType类型的p。

先将x的类型赋给c,判断如果x的类型是String,那么就返回c。

然后将c这个参数的类型所实现的接口数组赋给ts,判断ts是否为空,如果不为空,循环遍历接口数组。

判断如果接口中的一个输入泛型接口,且接口属于Comparable接口,且泛型参数不为空,且泛型参数数组元素只有一个,且这个元素是c,那么返回c。

最后如果没提前返回,就返回空。

说简单点,就是判断参数是否实现Comparable接口,且实现接口的泛型参数是否是参数本类。


    static int compareComparables(Class<?> kc, Object k, Object x) {
        return (x == null || x.getClass() != kc ? 0 :
                ((Comparable)k).compareTo(x));
    }

这个方法是对参数进行比较大小,先判断参数x是否为空或x的类型不是kc的类型,如果成立,就返回0,否则强转k参数为comparable然后调用compareTo方法比较x。


    static final int tableSizeFor(int cap) {
        int n = cap - 1;
        n |= n >>> 1;
        n |= n >>> 2;
        n |= n >>> 4;
        n |= n >>> 8;
        n |= n >>> 16;
        return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
    }

这个方法是计算底层数组长度的方法。

首先将参数减一赋给n。

然后将n与n右移一位的值进行或运算,然后将运算结果赋给n。

同样的与n右移2、4、8、16位的值进行或运算,然后将运算结果赋给n,然后进行下一次运算。

最后判断n是否小于,如果小鱼0就返回1,否则判断n是否大于等于MAXIMUM_CAPACITY也就是最大数组容量,如果大于了就返回那个数组最大容量也就是2的30次方,否则返回n+1。


transient Node<K,V>[] table;

这个是底层数组,不能被序列化。


transient Set<Map.Entry<K,V>> entrySet;

这个是键值对集合,不能被序列化。


transient int size;

这个是键值对数量,不能被序列化。


transient int modCount;

这个是修改次数,不能被序列化。


int threshold;

这个是底层数组扩容的门槛,数组长度到达这个数,就会对数组扩容。


final float loadFactor;

这个是载荷,后面解释。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值