Android 5.0之後對HashMap的修改,androidhashmap
之前發現在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