hashCode和identifyHashCode的区别

System类提供一个identifyHashCode(Object o)的方法,该方法返回指定对象的精确hashCode值,也是根据该对象的地址计算得到的HashCode值。当某个类的hashCode()方法被重写之后,该类实例的hashCode()的方法就不能唯一标识该对象。但是通过identifyHashCode()方法返回的依然是hashCode()值,依然是根据该对象的地址计算得到 hashCode值。所以两个对象的identifyHashCode()值相同,该对象就绝对是一个对象

HashCode()和identifyHashCode()的关系

(1)对象的hashCode()一般是通过将对象的内部地址转换成一个整数来实现的

(2)当一个类重写了Object类的hashCode()方法时,他的hashCode则由重写的实现逻辑决定,此时的hashCode()值一般就不再和对象本身的内部地址有相应的哈希值了

(3)当null调用hashCode()方法时,会返回异常,但是System.identifyhashCode(null)则会返回0

(4)一个对象的identifyHashCode(Object o)能够始终和该对象的内部地址有一个相对应的关系,单从这个角度来说,他可以代表对象的引用地址

class test{

public test(){}

}

public class aaa {
public static void main(String[] args)  throws Throwable{
String a=new String("111");
String c=new String("111");
String b=a;
System.out.println(System.identityHashCode(a));  //366712642


System.out.println(System.identityHashCode(b));//366712642   因为a和c指向的是同一个对象,所以地址是一样的
System.out.println(System.identityHashCode(c));//1829164700
System.out.println(a.hashCode());//48657   hashCode()方法返回的不再是地址值,因为String类对hashCode()方法进行了改写,返回的是值的hashCode

System.out.println(c.hashCode());//48657

test aTest=new test();
System.out.println(aTest.hashCode());      //366712642

System.out.println(System.identityHashCode(aTest));//366712642

这两个值相等因为返回的都是test类生成的对象,test类的hashCode()没有被重写,所以他返回的依然是该对象的地址

}

}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值