HashMap用数组存放数据,初始长度16
一、存放数据的过程:
1◆先获得键的哈希值key.hashCode()
2◆用哈希值来计算一个下标值index
3◆将键和值,封装成一个Entry对象
4◆Entry对象,放入index位置
空位置,直接放入
有数据,依次用equals()比较剪是否相等
找到相等的,覆盖值
没有相等的,链表连在一起
5◆负载率(数据数量/数组数量)、加载因子到0.75
新建容量翻倍的新数组
所有数据,重新哈希,放入新数组
◆jdk1.8
链表长度到8,转成红黑树
红黑数数量减少到6,转回成链表
二、hashCode()
从Object继承的方法
Object中默认实现是用内存地址值,作为哈希值
可以在子类中重写这个方法,用对象属性的数据,来计算哈希值
public native int hashCode();
使用native
关键字说明这个方法是原生函数,也就是这个方法是用C/C++
语言实现的,并且被编译成了DLL
,由java去调用。这些函数的实现体在DLL中,JDK的源代码中并不包含,是看不到源码的。对于不同的平台它们也是不同的。java就是在不同的平台上调用不同的native
方法实现对操作系统的访问的。
*)相同属性,必须计算出相同哈希值
*)不同属性,必须计算出不同哈希值
@Override
public int hashCode() {
int prime = 31;
int result = 1;
result = result*prime + id;
result = result*prime + name.hashCode();
return result;
}