openjdk8: http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/5b86f66575b7html
最近在看Spring
源碼的過程當中看到這麼一行java
@{link org.springframework.context.support.AbstractApplicationContext}spring
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)
app
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進制的字符串
ide
因此System.identityHashCode()
是什麼?this
來看個實例.net
public class OK { public static void main(String[] args) { OK ok1 = new OK(); OK ok2 = new OK(); System.out.println("ok1 - hashCode : " + ok1.hashCode());// ok1 - hashCode : 1554874502 System.out.println("ok2 - hashCode : " + ok2.hashCode());// ok2 - hashCode : 1846274136 System.out.println("ok1 - System.identityHashCode : " + System.identityHashCode(ok1)); //ok1 - System.identityHashCode : 1554874502 System.out.println("ok2 - System.identityHashCode : " + System.identityHashCode(ok2));//ok2 - System.identityHashCode : 1846274136 } }
從結果上來看,相同對象的hashCode()和System.identityHashCode()是一致的code
接下來,咱們覆蓋下hashCode()htm
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()); // ok1 - hashCode : 1 System.out.println("ok2 - hashCode : " + ok2.hashCode()); // ok2 - hashCode : 1 System.out.println("ok1 - System.identityHashCode : " + System.identityHashCode(ok1));//ok1 - System.identityHashCode : 1554874502 System.out.println("ok2 - System.identityHashCode : " + System.identityHashCode(ok2));//ok2 - System.identityHashCode : 1846274136 System.out.println("ok1 - SuperHashCode : " + ok1.getSuperHashCode());//ok1 - SuperHashCode : 1554874502 System.out.println("ok2 - SuperHashCode : " + ok2.getSuperHashCode());//ok2 - SuperHashCode : 1846274136 } }
能夠看到,若是重載了hashCode()
方法,而又想獲未重載以前的object.hashCode()
,則能夠使用System.identityHashCode()
對象
openJDK8: http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/5b86f66575b7
關於System.identityHashCode()
裏面的聲明是這樣的
/** * 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和identityHashCode底層是怎麼生成的