HashMap 1.8的源码分析一
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable { private static final long serialVersionUID = 362498820763181265L;
首先它是继承了AbstractMap,这个抽象类里面有很多方法,
从这个可以看出面向对象的特性,单继承,接口的多实现,
同时实现了序列号接口,可以进行网络传输,在进行网络传输的时候实体类一般都会实现序列号接口,以便传输,
在整合redis的时候,如果实体没有进行序列化,是无法传输进入到redis中的value上的
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
这个是进行初始化容量的,
1 << 4
这个是位运算: 二进制为 1 向前唯一四位,那么就是10000 那么换成十进制就是2的4次方 就是16,所以hashmap的初始容量为16,
static final int MAXIMUM_CAPACITY = 1 << 30;
这个是hashmap的最大容量,表示一个很大的值,大概为2的30次方
static final float DEFAULT_LOAD_FACTOR = 0.75f;
这个表示hashmap的装载因子
static final int TREEIFY_THRESHOLD = 8;
这个是1.8之后特有的,当链表结构到8时就会变成红黑树,
static final int UNTREEIFY_THRESHOLD = 6;
由树变成链表的阀值
/**
* The smallest table capacity for which bins may be treeified.
* (Otherwise the table is resized if too many nodes in a bin.)
* Should be at least 4 * TREEIFY_THRESHOLD to avoid conflicts
* between resizing and treeification thresholds.
*/
static final int MIN_TREEIFY_CAPACITY = 64;
当桶中的bin被树化时最小的hash表容量。(如果没有达到这个阈值,即hash表容量小于MIN_TREEIFY_CAPACITY,当桶中bin的数量太多时会执行resize扩容操作)这个MIN_TREEIFY_CAPACITY的值至少是TREEIFY_THRESHOLD的4倍。
static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); }
在HashMap中,为了更好的性能,我们希望作为Key的对象提供一个合理的hash函数以便能将其合理的分配到桶中。 而在实际的HashMap中,对从对象获取的hash值又做了调整,代码过程的直接翻译就是:如果Key值为null,返回0;如果Key值不为空,返回原hash值和原hash值无符号右移16位的值按位异或的结果。
笔记转移,由于在有道云的笔记转移,写的时间可能有点久,如果有错误的地方,请指正