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()
