hash原理的理解

1.Hash原理的理解
哈希:翻译是 散列 意思是分散的意思,通常我们在查找某个数据的时候,我们想快速定位到某条数据,我们会采用哈希算法来解决这个问题。


JAVA哈希的底层实现:其实是基于桶结构来处理的,也就是一个数组结构,然后里面的元素是NODE元素,这个数据结构是链表来实现的,里面的变量有 hash,key,value,next,通过这种方式,我们能够大大减少数据的范围,Eg:hashMap 里面每次会默认分配16大小的一个桶,我们每次存放数据的时候,会通过当前的HASH值和当前桶的大小做一个与运算,这样能够定位到我们即将要寻找或存放的数据放在哪个桶里面,这样在大量数据基础上,其实能够排除接近n-1/n的数据量。
具体操作:
1.判断当前map中是否存在该桶结构,如果不存在,则resize()


2.通过 当前桶的大小 和 hash值 做与运算,这样能获取桶的索引值,如果不存在该桶,那么则新建一个桶,如果存在,则去遍历该桶里面的链表结构,查看是否存在同样的key值,而判断是否存在该key值得条件是


a.如果该链表中的hash值与新要加入或判断的hash值一样,并且 如果key的栈地址一样或者 key不等于空并且key.equals(k)内容一样的话,那么就覆盖旧值。
否则如果找不到该key 则新建一个Node 跟在已有链表中。


3.通常在我们自定义的类中,如果需要判断对象是否相同的话,我们通过需要覆写override Object类型的  equals 和 hashCode 方法,因为Object 中hashCode生成规则 是类名加上 该对象的内存地址,这个方法是 native方法,通过C语言写的,所以这部分没有开源。


Integer 是通过数字本身来生成 hashcode
String 则是 char[] 则是比较每一个字符来看equals是否相等,


如果我们需要比较一个类的多个属性是否相等的话,我们是可以将多个属性值拼接在一起形成一个key值,来进行比较,这样的就省去了比较多个属性的操作。

猜你喜欢

转载自blog.csdn.net/z123271592/article/details/78420001