现象:

测试提了一个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. win7仿win98电脑主题

    http://ys-d.ys168.com/599631823/S7hMfgo3M382J764IOJ8/plus98_for_windows_7_by_ansonsterling.zip

  2. virtualenv是什么?virtualenv的安装及pycharm的配置和使用

    virtualenv是什么? virtualenv是一个创建隔绝的Python环境的工具.virtualenv创建一个包含所有必要的可执行文件的文件夹,用来使用Python工程所需的包.简单的说就是一 ...

  3. Git回滚merge操作

    执行完merge操作后,没有修改代码 1.命令 ⑴ git reflog 查看merge操作的上一个提交记录的版本号 ⑵ git reset –hard 版本号 这样可以回滚到merge之前的状态 2 ...

  4. v-for & duplicate key bug

    v-for & duplicate key bug vue warn & v-for & duplicate key bug <span class="audi ...

  5. SQL 抛出异常的例子 RAISERROR 的使用

    先创建一个procedure 当输入的值不在0-100之间时会报出异常 create proc proc_x @a int as begin ) ,) else select @a end go 测试 ...

  6. Visual Studio 中设置npm

    VS2017自带的npm会去国外的镜像下载文件, 奇慢无比, 还是马云家淘宝的镜像适合国内用户. 淘宝npm镜像地址:  https://registry.npm.taobao.org VS中使用淘宝 ...

  7. Codeforces Round #447 (Div. 2) 题解

    A.很水的题目,3个for循环就可以了 #include <iostream> #include <cstdio> #include <cstring> using ...

  8. [FJWC2018]全排列 DP

    题面 题面 题解 (表示第一段文字导致我在考场上没看懂题--因为我以为这个定义是定义在整个排列上的,所以相似 = 相同.结果其实是可以应用在一个区间上--) 首先我们发现,2个区间相似,其实就是离散化 ...

  9. 如何用Qt Python创建简单的桌面条形码应用

    Qt for Python可以快速跨平台的GUI应用.这篇文章分享下如何结合Dynamsoft Barcode Reader SDK来创建一个简单的读码应用. 安装Qt for Python 官方站点 ...

  10. bzoj2621: [Usaco2012 Mar]Cows in a Skyscraper(状压DP)

    第一眼是3^n*n的做法...然而并不可行T T 后来发现对于奶牛的一个状态i,最优情况下剩下那个可以装奶牛的电梯剩下的可用重量是一定的,于是我们设f[i]表示奶牛状态为i的最小电梯数,g[i]为奶牛 ...