Java对象的地址值(identityHashCode(Object x)、hashCode()区别)

  • Post author:
  • Post category:java



Object的hashCode()默认是返回内存地址的,但是hashCode()可以重写,所以hashCode()不能代表内存地址的不同


System.identityHashCode(Object x)方法可以返回对象的内存地址,不管该对象的类是否重写了hashCode()方法。

  • 首先看一下System.identityHashCode(Object x)方法的源码:
/**
     * Returns the same hash code for the given object as
     * would be returned by the default method hashCode(),
     * whether or not the given object's class overrides
     * hashCode().
     * The hash code for the null reference is zero.
     *
     * @param x object for which the hashCode is to be calculated
     * @return  the hashCode
     * @since   JDK1.1
*/
public static native int identityHashCode(Object x);

从源码的注释中可以看出来:

返回给定对象的哈希码,与默认方法hashCode()将返回的哈希码相同,无论给定对象的类是否覆盖hashCode();空引用的哈希码为零。

  • 这是因为给定的类可以重写hashCode方法,,如果不同对象根据重写的hashCode方法获取的值可能会一样;例如:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class InstanceTest implements Cloneable {

    String roleName;

    Boolean permission;

    Long roleId;

    public static void main(String[] args) throws CloneNotSupportedException {
        InstanceTest instanceTest=new InstanceTest("abc",true,1l);
        InstanceTest clone = (InstanceTest) instanceTest.clone();
        System.out.println(clone.toString()+"++++++++++++++"+instanceTest.toString());
        System.out.println(System.identityHashCode(clone)+"=========="+System.identityHashCode(instanceTest));
        System.out.println(clone.hashCode()+"--------------"+instanceTest.hashCode());
    }
   
}

运行结果:

在这里插入图片描述

通过测试可以看出,克隆出来的两个对象(实际上是两个不同的对象,内存地址不一样)的每个属性值都是一样的,所以根据这个类中重写的hashCode方法得出的值也是一样。


判断两个对象是否是指向同一地址,不能依靠类中的hashCode方法,而是需要使用System.identityHashCode(Object x)方法进行判断



版权声明:本文为SnowDujc原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。