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;
这个是载荷,后面解释。