javaSE进阶-哈希值


哈希值

  • 是JDK根据对象的地址或者字符串或者数字算出来的int类型数值
  • Object类中有一个hashCode方法可以获取对象的哈希值

hashCode();

  • 同一个对象多次调用hashCode方法返回的哈希值是相同的
  • 默认情况下,不同对象的哈希值是不相同的
  • Java通过哈希取值 java中哈希值_字符串

  • 如上图:因为实例化了两个对象,所以他们的哈希值是不相同的
  • 在学生类中重写hashCode方法,这样无论实例化多少个对象,他们的哈希值都是一样的
  • Java通过哈希取值 java中哈希值_Java通过哈希取值_02

哈希表

  • JDK8之前,底层采用数组+链表实现,可以说是一个元素为链表的数组
  • JDK8之后,在长度比较长的时候,底层实现了优化
  • 哈希表又是hashSet集合的底层,默认初始化容量为16,

怎样把哈希值存入哈希表中

Java通过哈希取值 java中哈希值_Java通过哈希取值_03

因为,哈希表默认容量为16,所以它的下标为0-15,而每一个字符串都有一个哈希值,我们需要把哈希值存入哈希表中我们需要先做个一个计算

将字符串的哈希值取16的余

如“hello”的哈希值 99162322 % 16 = 2 余数为2,就存储到下标为2的哈希表中

Java通过哈希取值 java中哈希值_Java通过哈希取值_04

声明:后存储的元素它会先与已经存储在下标为2的哈希表中的数据相比较,先比较他们的哈希值是否相同,不相同就存储在同一位置上,相同再比较字符串内容是否相同(hello.equlas(“world”)),如果相同就不存储,不相同就存储在同一位置上。

首先,我们知道hello已经存储在下标为2的哈希表中,当我们存储world时,它就会先于已经存储在下标为2的哈希表中的数据相比较,先比较他们的哈希值是否相同,不相同就存储在同一位置上,比较发现hello与world的哈希值不相同,所以world这个元素也存入到了下标为2的哈希表中,同理java这个元素也存储到下标为2的哈希表中

当我们存储第四个元素world时,它也会与先存入哈希表中的数据相比较,发现它与之前存入的world元素的哈希值相同,这时就会比较它俩字符串内容(world.equlas(“world”))是否相同,发现是相同的,所以它两重复了,那么第四个元素world就不能存储到哈希表中

同理:通话这个字符串的哈希值除以16的余数是3,那么他就存储到下标为3的哈希表中
存储“重地”这个元素时,它先与通话这个元素的哈希值比较,结果相同,再比较字符串内容,发现是不同的,那么重地这个元素也会存储到下标为3的哈希表中

相同元素是不能同时存储在哈希表中的,所以Set集合不能存储相同元素