Skip to content

hashCode 方法


基本介绍

返回对象的哈希码值(可以当作是地址,真实的地址Java 虚拟机上),

作用

(1)支持此方法是为了提高哈希表的性能

(2)可以提高具有哈希结构的容器的效率

易错点

返回的是哈希码值,不能理解为虚拟地址

具体解释:虚拟地址是操作系统为程序分配的内存地址,用于访问实际的物理内存,属于底层硬件和操作系统的范畴;而 hashCode( ) 是 Java 语言层面的方法,其返回值是对对象的一种哈希编码,与对象在内存中的实际存储地址没有直接关联

底层实现

实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数(十进制数),这一般通过将该对象的内部地址转换成一个整数来实现,但是 Java 变成语言不需要这种实现技巧

使用细节

(1)两个引用,如果指向同一个对象,哈希值一样;如果指向不同对象,哈希值不一样

(2)哈希值主要是根据地址号来的,不能完全将哈希值等价于地址

代码示例

java
public class hashcode {
    public static void main(String[] args) {

        int[] arr = new int[5];
        hashtest hashtest = new hashtest();
        hashtest hashtest1 = new hashtest();
        System.out.println("111".hashCode());
        System.out.println("222".hashCode());
        System.out.println(hashtest.hashCode());
        System.out.println(hashtest1.hashCode());
        System.out.println(arr.hashCode());
    }
}
class hashtest{

}
//输出结果
48657
49650
1163157884
1956725890
356573597

⭐ 与重写 equals 的联系

重写 euqals 方法后,两个对象就不再是比较地址是否相同,此时两个对象是不同的对象

(1)由于哈希值是 JVM 使用随机数生成的,两个对象的哈希值可能相同(哈希冲突),有

(2)当与集合关联时,两个对象即时满足 equals 条件,但是哈希值不同,在存储时就会存储在不同的位置,这样就会出现一些不可预料的错误

规范:重写 equals() 方法也要同时重写 hashCode()

(3) 如果不与集合结合使用(涉及元素存储),可以不重写 hashCode()