然后带着郁闷的心情给程序加断点进行原因寻找,发现原来是HashMap的中服务器和终端双方对于同样的key存放顺序竟然不一样!
在HashCode产生冲突的情况下,不同的key在HashMap中存入的位置应该是相同的,即使在hashCode产生冲入,如果key-value put的顺序相同,其存放的位置也应该是相同的。
所以问题就应该出在HashMap上,只能去查看Java和Android关于HashMap的源码了,发现两者的hashCode()方法竟然不一样,小小激动了一下,可仔细一看,发现Android只是优化Java中的hashCode()方法,使其更加易于阅读而已,但所运用的原理还是一样的,真是=。=。
具体代码比较如下:
无奈,我只能继续在源码里查看比较,最后发现原来是两者的默认构造函数不一样,本质上就是两者的table大小不一样,Java中的table默认大小是16×0.75=12(容量×负载因子),而Android中table的默认大小是2,所以即使是同样的字符串按同样的顺序放入HashMap中它们的key值存放顺序也会不一样。
其实仔细读源码会发现,在Android中所实现的HashMap类关于"阈值(threshold )"的设定也已经和Java不同了,具体请看截取的源码:
所以总结来看HashMap在不同平台或不同语言中的实现细节是不一样的,吃一堑,长一智,反正以后切记,牵扯到顺序时HashMap真的不适合!