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 版权协议,转载请附上原文出处链接和本声明。