hashcode()和System.identityHashCode()
openjdk8: http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/5b86f66575b7
最近在看Spring
源码的过程中看到这么一行
@{link org.springframework.context.support.AbstractApplicationContext}
1 2 3 4 5 6 7 8 9 10 11 public AbstractApplicationContext () { this .logger = LogFactory.getLog(this .getClass()); this .id = ObjectUtils.identityToString(this ); this .displayName = ObjectUtils.identityToString(this ); this .beanFactoryPostProcessors = new ArrayList(); this .active = new AtomicBoolean(); this .closed = new AtomicBoolean(); this .startupShutdownMonitor = new Object(); this .applicationListeners = new LinkedHashSet(); this .resourcePatternResolver = this .getResourcePatternResolver(); }
在初始化Context
时设置 id
和 displayName
名字的时候 ObjectUtils.identityToString(this)
1 2 3 4 5 6 7 public static String identityToString (Object obj) { return obj == null ? "" : obj.getClass().getName() + "@" + getIdentityHexString(obj); } public static String getIdentityHexString (Object obj) { return Integer.toHexString(System.identityHashCode(obj)); }
可以看到Spring
的做法是:类名 + @ + 16进制的字符串
所以System.identityHashCode()
是什么?
hashcode()和System.identityHashCode()对比 来看个实例
1 2 3 4 5 6 7 8 9 10 11 12 13 public class OK { public static void main (String[] args) { OK ok1 = new OK(); OK ok2 = new OK(); System.out.println("ok1 - hashCode : " + ok1.hashCode()); System.out.println("ok2 - hashCode : " + ok2.hashCode()); System.out.println("ok1 - System.identityHashCode : " + System.identityHashCode(ok1)); System.out.println("ok2 - System.identityHashCode : " + System.identityHashCode(ok2)); } }
从结果上来看,相同对象的hashCode()和System.identityHashCode()是一致的
接下来,我们覆盖下hashCode()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 public class OK { @Override public int hashCode () { return 1 ; } public int getSuperHashCode () { return super .hashCode(); } public static void main (String[] args) { OK ok1 = new OK(); OK ok2 = new OK(); System.out.println("ok1 - hashCode : " + ok1.hashCode()); System.out.println("ok2 - hashCode : " + ok2.hashCode()); System.out.println("ok1 - System.identityHashCode : " + System.identityHashCode(ok1)); System.out.println("ok2 - System.identityHashCode : " + System.identityHashCode(ok2)); System.out.println("ok1 - SuperHashCode : " + ok1.getSuperHashCode()); System.out.println("ok2 - SuperHashCode : " + ok2.getSuperHashCode()); } }
可以看到,如果重载了hashCode()
方法,而又想获未重载之前的object.hashCode()
,则可以使用System.identityHashCode()
深入System.identityHashCode() openJDK8: http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/5b86f66575b7
关于System.identityHashCode()
里面的声明是这样的
1 2 3 4 5 6 7 8 9 10 11 12 public static native int identityHashCode (Object x) ;
对于源码中的解读可以参考 hashCode和identityHashCode底层是怎么生成的