Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 5.0之後對HashMap的修改

Android 5.0之後對HashMap的修改

編輯:關於Android編程

之前發現在Android 5.0的機子上放在HashMap裡面的數據取出後跟Android 5.0之下的機子不一樣,導致項目裡面一個接口出了問題(接口做了緩存,request參數順序變化的話就會導致一些數據拿不到),然後去查看了一下Android 5.0和Android 4.4 關於HashMap的源碼,使用meld查看差異能夠看到果然google對HashMap的實現做了修改.

下圖左邊為Android 5.0的源碼,右邊為Android 4.4的源碼

\

 

 

\

 

從源碼中可以看到,Android 5.0 在計算key的HashCode使用的是下面的算法.

    private static int secondaryHash(int h) {
        // Spread bits to regularize both segment and index locations,
        // using variant of single-word Wang/Jenkins hash.
        h += (h <<  15) ^ 0xffffcd7d;
        h ^= (h >>> 10);
        h += (h <<   3);
        h ^= (h >>>  6);
        h += (h <<   2) + (h << 14);
        return h ^ (h >>> 16);
    }

而Android 4.4中計算Key的HashCode的算法明顯跟Android 5.0中不同,所以這也導致了在get之後,在兩個系統上同樣的數據不同的順序。如果對存儲的數據有順序需求的話改為使用紅黑樹構建的TreeMap就OK了.

    static int secondaryHash(Object key) {
        int hash = key.hashCode();
        hash ^= (hash >>> 20) ^ (hash >>> 12);
        hash ^= (hash >>> 7) ^ (hash >>> 4);
        return hash;
    }

 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved