大神勿喷,如果有错的帮忙修正哈。
hashmap工作原理
HashMap基于hashing原理,当我们把价值对传给put()这个方法时则会调用键对象的hashcode()方法计算得到hashcode值,然后找到相对应的bucket的位置来存储这个值对象,当调用get()方法时则调用 则调用 equals()方法找到对应的键值对,然后返回值对象。当发生碰撞(hascode相同)时,使用链表来解决碰撞问题。即bucket位置是一个链表,对象将会存储在链表的下一个节点。hashmap在每个链表节点存在键值对对象。
hashmap数据结构
在java语言中hashmap基本数据机构有两种:数组,链表。数据结构中又叫“链表散列”。
数组:查询速度快,插入删除困难。
链表:查询速度慢,插入删除相对于来说比较容易。
hashmap初始加载因子:0.75(当到达容量的这个值时就会进行扩容)
/**
* The load factor used when none specified in constructor.
*/
static final float DEFAULT_LOAD_FACTOR = 0.75f;
前面说过hashmap的数据结构是由数组组成,数组默认大小是16(默认的初始容量必须是2的幂)
/**
* The default initial capacity - MUST be a power of two.
*/
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
hashmap的hashcode值计算
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
Hash值=(hashcode)^(hashcode >>> 16)
Hashcode与hashcode自己向右位移16位的异或运算(这样计算主要是为了获取的值足够随机,足够分散)
数组下标:hash&(16-1) = hash%16
对哈希计算得到的hash进行16的求余,得到一个16的位数,比如说是1到15之间的一个数,hashmap会与hash值和15进行与运算。这样可以效率会更高。计算机中会容易识别这种向右位移,向左位移