hashMap存储过程简要

147 阅读1分钟

哈希运算过程(重点) l 使用 Entry[] 存放数据 l 数组的默认初始容量是 16 l 容量翻倍增长 l 内部运算过程,由键来运算

l key.hashCode() 获得键的哈希值 l 用哈希值和数组长度来计算下标值 i l 把键值对封装成 Entry 实例,放入 i 位置 n 空位置,直接放入 n 有数据,依次用equals()比较是否相等 找到 相等的,覆盖值; 没有相等的,链表连接在一起 n 负载率,加载因子 0.75(当达到初始容量的3/4时): 新建翻倍容量的新数组 所有数据重新执行哈希运算放入新数组 n jdk1.8 链表长度到8,转成红黑树 数据减少到6,转回成链表

3.2 hashCode()方法

Object 的方法,Object中默认实现是用内存地址(地址值默认是16进制,当作为哈希值时自动转化成10进制值)值作为哈希值 @Override public int hashCode() { /* * x,y如果相同,要返回相同的哈希值 * x,y不同,要尽量产生不同哈希值,尽量分散 * 数学家发明了一种算法 是一种惯用的,有效算法 / int p = 31;//31是一个神奇值 int r = 1; r = rp + x; r = r*p + y; return r; } @Override public boolean equals(Object obj) { //为了安全起见,先判断obj是不是Point类型的实例 if (obj instanceof Point) { //obj向下转回成Point Point p = (Point) obj; return x==p.x && y==p.y;} return false; }}