Android 5.0之后对HashMap的修改
2016-02-04 18:03
429 查看
转自:/article/1323190.html
之前发现在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使用的是下面的算法.
[java] view plain copy
而Android 4.4中计算Key的HashCode的算法明显跟Android 5.0中不同,所以这也导致了在get之后,在两个系统上同样的数据不同的顺序。如果对存储的数据有顺序需求的话改为使用红黑树构建的TreeMap就OK了.
[java] view plain copy
之前发现在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使用的是下面的算法.
[java] view plain copy
[code]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了.
[java] view plain copy
[code]static int secondaryHash(Object key) { int hash = key.hashCode(); hash ^= (hash >>> 20) ^ (hash >>> 12); hash ^= (hash >>> 7) ^ (hash >>> 4); return hash; }
相关文章推荐
- Android Studio常见错误
- Android自带的一个用于倒计时的类CountDownTimer
- Android System Properties
- Android-Universal-Image-Loader最新框架解析
- MTK平台,自定义编译开关
- Android上下文菜单 ContextMenu
- android studio快捷键
- 如何“任性”使用Android的drawText()
- Android的WebView中js与java代码相互调用
- Android 自定义标题栏TopBar
- Android应用开发之提升用户体验1–style和themes
- android studio 查看方法和属性列表
- Android 进阶 Android 中的 IOC 框架 【ViewInject】
- 21天学习android开发教程之SurfaceView
- 【Android】3.25 示例25--调启百度地图
- 图解Android事件传递之View篇
- Android ListView setOnItemClickListener点击无效原因分析
- 【Android】3.24 示例24--OpenGL绘制功能
- Android中的动画
- android 找不到启动activity