JDK1.8的hashmap实现与JDK1.7的差别导致的一个问题

来源:互联网 发布:js 绝对值 math.abs 编辑:程序博客网 时间:2024/06/06 05:32


在项目中,同一段代码在同事的电脑上,和我的电脑上运行的结果不同,部署到tomcat中,网页显示结果为如下:

在同事电脑上运行显示结果为:


在我的电脑上运行显示结果为:


F12查看网页的响应,发现返回的相关数据的顺序不一样。具体如下:

在同事电脑上响应数据为:

"conBehavior":{"uid":276694,"消费等级":"灰领型","支付偏好":"货到付款","买家等级":"新手","2个月消费":425.00,"1个月消费":166.00}

在我的电脑上响应数据为:

"conBehavior":{"uid":276694,"1个月消费":166.00,"消费等级":"灰领型","支付偏好":"货到付款","买家等级":"新手","2个月消费":425.00}


明显发现对于conBehavior内部字段来说,其顺序存在很大不同。但顺序的不同是否会导致显示错误,还得根据网页js代码才能确定。通过搜索相关代码,查找到处理代码为:


此段代码确实和数据顺序有关。确定了这点,我开始从后端处理的源码进行分析。

首先,在eclipse中运行程序,断点调试相关代码。在下图所示程序中加断点和输出:


对应的调用程序,sql语句省略了后半部分:


对于此处理,最终是使用JFinal中的DB+record形式,我输出了record的记录,发现我电脑上的输出已经和同事不一样了。查看record值,发现其内部也使用了hash,因此应该是我们程序运行中hash的算法不同导致的。

查看JDK版本,同事的为1.8,我的是1.7,查找了一下,说是在JDK1.8中,对HashMap的存储结构由链表改成了平衡树。下面是一个参考的源码剖析:http://www.2cto.com/kf/201505/401433.html


经过一番JDK的卸载和重新安装,调试,显示结果正确了。


综上,有两点收获:

1、前端的JS代码处理不具有健壮性,可以考虑获取对应键,进行判断得到值。

2、得熟悉JDK版本的差异,以及部分重要的JDK源码。







0 0