HashMap加载因子为什么是0.75?大了和小了会怎么样?
0.75是趋于内存和访问效率上折中取的,
负载因子的大小决定了HashMap的数据密度
负载因子越大数据密度越大,发生碰撞的几率越高,数组中的链表也容易越长, 这样的话造成查询和插入时的比较次数增多,性能会下降。
负载因子越小,越容易触发扩容,虽然数据密度也越小,发生碰撞几率小,数组中链表越短对于查询和插入时比较次数也会少一些,性能也会提高。但是扩容会影响性能,所以建议初始化预设给它大一点空间。
如何解决Hash碰撞?
1.开放定址法
开放定址法就是一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入。
2.链地址法
将哈希表的每个单元作为链表的头结点,所有哈希地址为i的元素构成一个同义词链表。即发生冲突时就把该关键字链在以该单元为头节点的链表的尾部。
3.再哈希法
当哈希地址发生冲突用其他的函数计算另一个哈希函数地址,直到冲突不在产生为止。
4.建立公共溢出区
将哈希表分为基本表和溢出表两部分,发生冲突的元素都放在溢出表中。