Android 5.0之后对HashMap的修改
2015-07-20 21:05
405 查看
之前发现在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使用的是下面的算法.
而Android 4.4中计算Key的HashCode的算法明显跟Android 5.0中不同,所以这也导致了在get之后,在两个系统上同样的数据不同的顺序。如果对存储的数据有顺序需求的话改为使用红黑树构建的TreeMap就OK了.
转载请注明出处:/article/1323190.html
下图左边为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; }
转载请注明出处:/article/1323190.html
相关文章推荐
- Android Toast几种使用方法:附源码
- Android AIDL跨进程通讯
- Android 的进程与线程总结
- Android开发框架--AndroidAnnotations(一)
- Android首次启动时间长优化之预编译提取Odex
- Android开源侧拉菜单SlidingMenu Demo 配置与学习
- android代码控制seekbar的样式
- 锁屏效果
- android学习路线
- Android疑惑篇------------含有button按钮的ListView中,列表项无法获取焦点的问题
- Android自定义属性理解和应用
- Android清单文件详解(六) ---- <activity>节点的属性
- android桌面图标更换后不起效果
- Android 四大组件学习之Activity六
- Android触摸事件
- Android Vold机制(一)
- Android onTouch事件与手势操作
- Android系统启动过程(转载)
- android优化(json工具,message新建/传递,avtivity深入学习视频)
- [Android初级]android单元测试之Activity单独测试