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