哈希值是虚拟的
是经过一个特定的算法计算出来的,形象上代表了地址,但还是不一样的
hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值
源码:
public int hashCode()
{
int h = hash;
if (h == 0 && !hashIsZero) {
h = isLatin1() ? StringLatin1.hashCode(value)
: StringUTF16.hashCode(value);
if (h == 0) {
hashIsZero = true;
} else {
hash = h;
}
}
return h;
}
————————————————
Java中未重写的对象的toString()打印的地址值实际上是哈希值的16进制,对象名中保存的真实地址值无法打印。
附:而对于对象的==(或equals)比较的是引用类型变量真实地址值,不是hashCode()计算的值。
在集合中,之所以要重写hashCode方法,就是加快速度。
首先比较hash值,hash不同,对象一定不同,hash值相同,比较对象内容
比如:
> public class son {
> public static void main(String[] args) {
> HashSet<String> x=new HashSet<>();
> System.out.println("aaa".hashCode());
> System.out.println("aaa".hashCode());
> } }
这是相同的情况,输出结果为
96321
96321
public class son {
public static void main(String[] args) {
HashSet<String> x=new HashSet<>();
System.out.println("重地".hashCode());
System.out.println("通话".hashCode());
}
}
这是不同情况,但哈希值相同
运行结果为:
1179395
1179395