identityHashCode 與 hashcode 的區別

System.identityHashCode

返回給定對象的哈希碼,該代碼與默認的方法 hashCode() 返回的代碼一樣,無論給定對象的類是否重寫 hashCode()。null引用的哈希碼爲 0。

obj.hashcode

hashCode()方法是頂級類Object類的提供的一個方法,所有的類都可以進行對hashCode方法重寫。這時hash值計算根據重寫後的hashCode方法計算

如果在沒有重寫hashcode的前提下,hashcode的返回值等於identityHashCode的返回值

有哪些特點?

  1. 一個對象在其生命期中 identity hash code 必定保持不變;
  2. 如果a == b,那麼他們的System.identityHashCode() 必須相等;如果他們的System.identityHashCode() 不相等,那他們必定不是同一個對象;
  3. 如果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

結果分析:

  1. 從ca,cb,cc的輸出可以看出,CA沒有重寫HashCode,所以identityHashCode和hashCode是相等的。
  2. sa,sb,sc的hashCode是相同的,是因爲String類重寫了hashCode方法,它根據String的值來確定hashCode的值,所以只要值一樣,hashCode就會一樣。
  3. 如果identityHashCode 不相等,那他們必定不是同一個對象

參考博客:
https://www.jianshu.com/p/24fa4bdb9b9d

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章