java获取hashcode_java identityHashCode 和 hashCode

当类并没有重写Object#hashCode()时, 对于 System.identityHashCode(Object) 和 Object#hashCode() 的结果是一致的;

但对于类似String这些重写了Object#hashCode()的类时,当直接调用hashCode()时,由于重载的存在,因此调用的是子类中的方法;

对于这种情况,当我们需要获取对象的hashCode时

方法一:我们可以使用 System.identityHashCode(Object) 来直接获取对象的hashCode

方法二:可以通过MethodHandle 来调用被子类重载的父级的方法

public void identityHashCodeVsHashCode() throws Throwable {

Object o = new Object();

// 对于Object对象 而言;System.identityHashCode 和 Object#hashCode是相同的

assert System.identityHashCode(o) == o.hashCode();

// 对于 s1 和 s2 实际都是引用的 META区域中相同的对象

String s1 = "1";

String s2 = "1";

assert System.identityHashCode(s1) == System.identityHashCode(s2);

String s3 = new String("1");

assert s1.hashCode() == s3.hashCode();

// 对于s1 和 s3 实际是两个不同的对象, 但由于 String重写了Object#hashCode()

// 当需要对比对象时,我们并不能直接调用到Object#hashCode(),因此只能通过System.identityHashCode来获取对象的hashcode

assert System.identityHashCode(s1) != System.identityHashCode(s3);

// 获取指定类的构造方法并执行

Object object = MethodHandles.lookup().findConstructor(Object.class, MethodType.methodType(void.class)).invoke();

// 获取指定类的方法并绑定指定的对象

MethodHandle methodHandle = MethodHandles.lookup().findVirtual(Object.class, "hashCode", MethodType.methodType(int.class)).bindTo(s3);

Object invoke = methodHandle.invoke();

System.out.println((int)invoke);

assert (int)invoke == System.identityHashCode(s3);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值