对于hashmap的底层,我这确实看不太懂,但是为了面试会被问到,经常会看其他大牛对hashmap的原理解释,现在我来总结一下hashmap的一些知识点。
HashMap的底层主要是基于数组和链表来实现的
HashMap中主要是通过key的hashCode来计算hash值然后取余获得索引, 因为hash值太多了,不可能给每一个hash分配一个数组空间,但是有可能出现计算出来的hash值相同的可能(只要key的hashCode值相等),这就是hash冲突,我们通过链地址法来解决hash冲突。
我们会在冲突的位置建立一个链表,然后将冲突的元素插入到列表的尾端。
在链表长度大于或等于8的时候会转换为红黑树(jdk1.8),jdk1.7的时候是会转换成二叉树
负载因子:尺寸/容量,空表的时候负载因子是0,半满的负载因子是0.5,负载轻的表,出现冲突的可能新小,因为对于插入和查找都是最理想的。
当负载因子达到0.75的时候就会进行链表的加倍,2倍
hashmap的默认容量是16,键值可以为null
(hashtable默认容量是11,键值不能为null)
为什么要扩容两倍,是因为hashmap和内部的一个算法有关系(n-1)&hash,&能让计算机直接计算,当hashmap的容量为2的n次幂时候(n-1)的2进制都是1,这样添加元素的hash值进行位运算的时候能够充分的散列,使添加的元素均匀分布在hashmap的每个位置,减少hash碰撞。