现象:

测试提了一个bug,我完全复现不了,但是最吊诡的是在其他人的机器上都可以复现。起初以为是SVN合并后出现的冲突,后来经过对比法排查:

step 1:

  我本地开两个jetty,一个跑合并之前的版本,一个跑合并之后的版本,数据库、redis配置都一样的,结果一致,由此可以推测应该不是代码的问题。

step 2:

  我电脑和别人电脑同样的配置、连的一个数据库,同样的代码、同样的数据,得到了两个结果,我这里是正常的,而且除了我其它人都可以复现,我喵了狗....

  我还一度以为是灵异现象....o(╯□╰)o

step 3:

  搞了很久,注意到还是有不一样的地方,我本地的jdk版本是1.8的,他们包括测试服务器用的应该都是1.7版本的。

  后来经过验证发现,关键点在于,在前端展示的时候,之前的人写了一个列表,这个列表的显示顺序依赖了一个无序数据结构Set的顺序!!!

  因为jdk7和jdk8的hash算法是不同的,而在jdk8上面的hash之后的顺序刚好是正确的(真尼玛巧....),然后在jdk7之前的话就会出问题。  

反思问题出现的原因:  

  因为这个js文件的是在是太难驾驭(可维护性基本为负,我觉得没必要花时间去理解那么烂的代码,把代码见缝插针放进去不出问题就好....) 

  让我去改别人的代码的时候,总是抗拒去理解别人的代码(虽然它根本就不可理解...),但让我自己重写一个新功能的时候就感觉比较爽,行云流水的感觉,逻辑也比较清晰,但作为一个低级码农,给别人擦屁股大概是必备技能...

  在这里也发现一个很有趣的现象,开始的时候我小心翼翼的写代码,后来我发现之前的人都这么写,然后我不自觉的也开始往烂了写了,反正大家都这么干,大概这就是工程开发中的破窗效应吧。一旦开始烂了就一发不可收拾了....

解决方案:

  以后跟其它人进行版本统一是表面上的解决方案,其根本解决方案在于写代码的时候一定要过脑子...过!脑!子! 为防止呆逼,得要挑两个不同的时间段review两次。

  为了避免之后的人再掉坑,本来想在返回客户端的时候将set进行排序,但我已经不敢乱动代码了,动了一处其它地方就会冒出来各种bug...,干脆强制他使用LinkedHashSet算了...  

  这个问题就算是马马虎虎的解决了....

JDK1.7和JDK1.8中hash算法的区别:

1.7中map的hash算法:

1.8中map的hash算法:

.

记一次诡异的bug调试——————关于JDK1.7和JDK1.8中HashSet的hash(key)算法的区别的更多相关文章

  1. 记一次诡异的bug

    使用django做项目,在视图函数中需要查询,查询前构造一个查询参数的模型来过滤参数防止报错,然后调用模型的方法返回一个字典,包括了所有查询的字段和值,发现只要查询过一次之后,后续的访问查询结果会在之 ...

  2. 记一个非常诡异的关于 shared_ptr 的 bug

    问题描述 今天写项目的时候遇见一个特别诡异的 bug,体现在在执行某条语句时,程序会莫名崩溃,并且给出的错误信息也非常难懂,只有一个malloc(): invalid size (unsorted)错 ...

  3. 记一次 springboot 参数解析 bug调试 HandlerMethodArgumentResolver

    情况描述 前端输入框输入中文的横线 -- ,到后台接收时变成了 &madsh;$mdash 正常应该显示成这样: bug调试思路记录 最开始完全没有向调试源码方面想,试了不少方法,都没解决,没 ...

  4. geotrellis使用(十二)再记录一次惨痛的伪BUG调试经历(数据导入以及读取瓦片)

    Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html 目录 前言 BUG还原 查找BUG 解决方案 总结 后记 一.前 ...

  5. geotrellis使用(七)记录一次惨痛的bug调试经历以及求DEM坡度实践

    眼看就要端午节了,屌丝还在写代码,话说过节也不给轻松,折腾了一天终于解决了一个BUG,并完成了老板安排的求DEM坡度的任务,那么就分两段来表. 一.BUG调试 首先记录一天的BUG调试,简单copy了 ...

  6. <转载>linux下内存泄露查找、BUG调试

    先收藏着,抽空好好看看:http://www.ibm.com/developerworks/cn/linux/l-pow-debug/ 简介 调试程序有很多方法,例如向屏幕上打印消息,使用调试器,或者 ...

  7. 最难忘的Bug调试经历

    摘要:目前,著名的社区问答网站Quora上出现一个很火的讨论:你调试过最难的Bug是什么?大家纷纷留言,把自己最痛苦的一次调试经验写下来. 相信每位程序员都有过一段不堪回首地Bug调试经历,程序员一听 ...

  8. 记一次线上bug排查-quartz线程调度相关

    记一次线上bug排查,与各位共同探讨. 概述:使用quartz做的定时任务,正式生产环境有个任务延迟了1小时之久才触发.在这一小时里各种排查找不出问题,直到延迟时间结束了,该任务才珊珊触发.原因主要就 ...

  9. 论 BUG调试与(程序猿)初学者

    作为一枚程序猿,BUG调试是最基本的技能,对于初学者更是重中之重.个人而言,要想为自己的程序猿生涯更上一层楼,就得知道什么是BUG调试,而且还必须知道怎么调好BUG.那么BUG究竟是什么呢?在我之前的 ...

随机推荐

  1. CodeForces Round #527 (Div3) D1. Great Vova Wall (Version 1)

    http://codeforces.com/contest/1092/problem/D1 Vova's family is building the Great Vova Wall (named b ...

  2. PHP中普通属性和静态属性

    普通属性(实例属性): 实例的单词为:instance 实例,其实也叫做“对象”: 普通(实例)属性,就是一个可以在该类实例化出的对象上使用的属性! 定义形式: class  类名{ var  $属性 ...

  3. MVC与MVP简单对比

    在Java平台,基于Spring等技术的MVC框架已经走向成熟:在.NET平台,微软也推出了MVC.MVP Framework,MVP不同于MVC的地方,关键在于,View不再显示的依赖于Busine ...

  4. 【Linux笔记】CentOS yum 安装 vsftpd

    vsftpd是一款在Linux发行版中最受推崇的FTP服务器程序.特点是小巧轻快,安全易用,下面直接上干货. 一.安装vsftp 以管理员的身份使用yum命令安装vsftp: [root@localh ...

  5. node web 应用热更新

    在每次更改完 node.js 项目后,我们都需要先将 node.js停止(快捷键: Ctrl+C),然后再通过命令再次运行,这样特别麻烦.这里我推荐使用 supervisor工具, npm 安装命令为 ...

  6. 【51Nod1773】A国的贸易 FWT+快速幂

    题目描述 给出一个长度为 $2^n$ 的序列,编号从0开始.每次操作后,如果 $i$ 与 $j$ 的二进制表示只差一位则第 $i$ 个数会加上操作前的第 $j$ 个数.求 $t$ 次操作后序列中的每个 ...

  7. 插件-监控页面加载之loading

    查看效果点https://icedjuice.github.io/plug-in/loading/loading.html 简单易用的loading插件,该插件并不是真正的监控页面的资源加载过程,而是 ...

  8. Oracle 多表关联并且批量修改

      描述:A表有 id,or_id 字段,B表有 id,code 字段   A表有  or_id 与B表的  id 关联,现要将A.or_id 替换成  B.code 数据    UPDATE  AS ...

  9. 【BZOJ5306】[HAOI2018]染色(NTT)

    [BZOJ5306]染色(NTT) 题面 BZOJ 洛谷 题解 我们只需要考虑每一个\(W[i]\)的贡献就好了 令\(lim=min(M,\frac{N}{S})\) 那么,开始考虑每一个\(W[i ...

  10. 【NOIP2017】宝藏(状态压缩,动态规划)

    [NOIP2017]宝藏(状态压缩,动态规划) 题面 洛谷 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路 ...