Android 5.0之後對HashMap的修改

       之前發現在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;
    }


轉載請註明出處:http://blog.csdn.net/l2show/article/details/46970507


發佈了66 篇原創文章 · 獲贊 15 · 訪問量 78萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章