System.identityHashCode
:
返回給定對象的哈希碼,該代碼與默認的方法 hashCode() 返回的代碼一樣,無論給定對象的類是否重寫 hashCode()。null引用的哈希碼爲 0。
obj.hashcode
:
hashCode()方法是頂級類Object類的提供的一個方法,所有的類都可以進行對hashCode方法重寫。這時hash值計算根據重寫後的hashCode方法計算
如果在沒有重寫hashcode的前提下,hashcode的返回值等於identityHashCode的返回值
有哪些特點?
- 一個對象在其生命期中 identity hash code 必定保持不變;
- 如果a == b,那麼他們的System.identityHashCode() 必須相等;如果他們的System.identityHashCode() 不相等,那他們必定不是同一個對象;
- 如果System.identityHashCode() 相等的話,並不能保證 a == b(畢竟這只是一個散列值,是允許衝突的);
有什麼作用?
加速對象去重:由特徵2可知,只要判斷出兩個對象的hashCode不一致,就知道這兩個對象不是同一個;又因爲hashCode()的性能比 " == "性能高得多,所以多數時候,用它來判斷重複。
擴展:爲啥hashCode()性能高?
因爲hashCode()的結果算出來後緩存起來,下次調用直接用不需要重新計算,提高性能
驗證:
public static void main(String [] args) throws Exception{
CA ca = new CA();
CA cb = new CA();
CA cc= ca;
System.out.println("ca identityHashCode:" + System.identityHashCode(ca) + ", ca hashcode:"+ca.hashCode());
System.out.println("cb identityHashCode:" + System.identityHashCode(cb) + ", ca hashcode:"+cb.hashCode());
System.out.println("cc identityHashCode:" + System.identityHashCode(cc) + ", ca hashcode:"+cc.hashCode());
//注意這裏是new Sting,而不是aa,因爲常亮aa在賦值的時候系統會優化,sb和sc指向字符串緩衝區域的aa,所以sb = sc
String sa = new String("aa");
String sb = "aa";
String sc = "aa";
System.out.println("sa identityHashCode:" + System.identityHashCode(sa) + ", ca hashcode:"+sa.hashCode());
System.out.println("sb identityHashCode:" + System.identityHashCode(sb) + ", ca hashcode:"+sb.hashCode());
System.out.println("sc identityHashCode:" + System.identityHashCode(sc) + ", ca hashcode:"+sc.hashCode());
System.out.println("sa == sb ? "+ (sa == sb ? "true":"false") + ", sb == sc ? "+(sb == sc ? "true":"false"));
}
輸出:
ca identityHashCode:21685669, ca hashcode:21685669
cb identityHashCode:2133927002, ca hashcode:2133927002
cc identityHashCode:21685669, ca hashcode:21685669
sa identityHashCode:1836019240, ca hashcode:3104
sb identityHashCode:325040804, ca hashcode:3104
sc identityHashCode:325040804, ca hashcode:3104
sa == sb ? false, sb == sc ? true
結果分析:
- 從ca,cb,cc的輸出可以看出,CA沒有重寫HashCode,所以identityHashCode和hashCode是相等的。
- sa,sb,sc的hashCode是相同的,是因爲String類重寫了hashCode方法,它根據String的值來確定hashCode的值,所以只要值一樣,hashCode就會一樣。
- 如果identityHashCode 不相等,那他們必定不是同一個對象
參考博客:
https://www.jianshu.com/p/24fa4bdb9b9d