1.什么是hash
它是将一个任意长度的二进制值通过一个映射关系转换成一个固定长度的二进制值。
a.任意长度的二进制值
b.映射关系(哈希算法--就相当于一个大学里面的学号的一个映射规则)
c.固定的二进制值(哈希值--相当于我们的大学里面的学号)
任意长度的二进制值 和 固定长度的二进制值 是一个一 一对应关系
固定长度的二进制值就相当于一个任意长度的二进制值的一个摘要
固定长度的二进制值 相当于一个关键字 key
真正有效的数据 就是这个学员的基本信息,一个任意长度的二进制值 value
key-----value
hash 只是确定了一个key和一个value的唯一映射关系。
为什么要这么做:
管理学号比管理学生的基本信息容易,学号是整型数据,计算机管理整形数据效率高节省时间,计算及排序,非常灵活的办法
2.hash表
解决了根据key找value的问题
特定:最重要的特定---它存储效率很高,取数据的时间复杂度是1 O(1)
hash 通过1个key1个输入,通过1个哈希函数,来找到数组中与这个key唯一映射的value
根据这个hash函数 找到 数组中这个value的下标
table aaa=[];
int index=hash(key);
int value=aaa[index];线性表的时间复杂度O(n)
3.hash函数
key:找下标,有哪些方法可以找到下标
a.除留取余数法(取模)
定义数 aaa 长度是16
int index = key%m;
m的取值规则是 m要取比数组长度小的最大质数。
m = 15;
int 1= 1%15;
key=1,value = 23;
key = 17 value=22; int index=17%15
key = 16,value=
4.hash表处理冲突方法:
a.线性探测法:探测的步长法 步长1或2,探测一个空位置
b.链表形式:
把以前的旧数据先保存,再用新数据指向旧数据形成链表。
1.hashmap初始容量是多少,负载因子是什么?
2.hashmap的put流程是什么,为什么这么做?
hashmap省去遍历,key是无序存储,造成一定的空间浪费,空间换取时间
hashmap中的hash底层依赖hashcode和equals
hashcode值是对象的逻辑值(门牌号),地址值是是对象的物理值(标识符),门牌号一样,但是内容不一定一样
hashmap的put方法时先比较hash值,再比较地址值或equals与hashcode和equals方法相关。少了很多判断,效率较高
如果类没有重写hashcode和equals,默认用object的,一般来说不会一样,string重写后会把相同的字符串去掉