特点:增,删,查的时间复杂度都是O(1)。
存储KEY可以为Null且唯一,Value可为NULL;扩容(初始大小为16(2的次幂),负载因子为0.75,扩容至原大小的2倍);
概念:扰动函数(hash函数):使用hash函数,是避免使用较差的hashCode();从而减少hash碰撞的发生。
JDK1.7
数据结构: 数组加链表(单向);线程不安全、多线程下会发生死循环;
数组加链表的结构:HashMap中的内部类Entry组成的数组;计算数组下标:自身实现的hash()算法,并做异或运算再取模得到对应的数组下标位置;自写hash算法的好处在于,减少了hash碰撞的发生。
代码如下:key的hashCode值,9次扰动处理=4次位运算+5次异或。
final int hash(Object k) {
int h = hashSeed;
if (0 != h && k instanceof String) {
return sun.misc.Hashing.stringHash32((String) k);
}
h ^= k.hashCode();
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}