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

现象:

测试提了一个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算法:

.

时间: 2024-12-13 05:47:24

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

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

情况描述 前端输入框输入中文的横线 -- ,到后台接收时变成了 &madsh;$mdash 正常应该显示成这样: bug调试思路记录 最开始完全没有向调试源码方面想,试了不少方法,都没解决,没办法了只能源码跟踪排查问题. 想着那个类是解析参数的?加个断点调试下就清除了,问题是不清楚到底是哪个类.so,search --- 开始 步骤1:搜索一下 : spring 参数解析 结果很多,看了很多博文之后,参考博客地址 发现了 HandlerMethodArgumentResolver 这里有两个函数

记一次诡异的调优

最近碰到的一个Java应用,费了半天劲还是没定位到是哪儿的问.发上来给大家看看,给点建议. 环境 DB Server:32core HPUX DB2 App Server * 2:8core HPUX WAS6.1 每个节点2个app 初次测试现象 WAS,DB2CPU均上不去,CPU.内存.磁盘.网络等都正常. 从loadrunner报告来看,有两个用例很奇怪,在16/24/50用户下,呈线性增长.根据经验,这两个用例可能存在资源争用,造成串行的地方. 检查DB2,正常,语句执行都很快,部分用

Bug调试(lldb)

原文网址:http://www.cnblogs.com/Twisted-Fate/p/4760156.html 今天博主有一些Bug调试的需求,遇到了一些困难点,在此和大家分享,希望能够共同进步. Xcode的Bug调试方法大概有以下几种: 1.断点,全局断点,条件断点配合Nslog找出Bug 2.静态分析工具:Analyze,静态检测内存 3.动态分析工具:Profile,其中最常用的是Leaks(检测内存泄露)和Allocations(检测内存溢出) 4.gdb调试:Xcode4.0之前的调

【原】各种语言疑难BUG调试记录

之前遇到棘手的BUG总是在处理过后就不管了,导致后面碰到后重复工作太多.现专门开辟一篇日志以记录接下来一路上的DEBUG记录. [C++] 1.mt.exe : general error c101008d: Failed to write the updated manifest to the resource of file 说明:由于VC需要把生成的文件中嵌入MANIFEST文件,而由于杀毒软件之类的会握有这个文件句柄(因为杀毒软件发现这个EXE,DLL正在读写),于是VC就写不进去了,方

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

作为一枚程序猿,BUG调试是最基本的技能,对于初学者更是重中之重.个人而言,要想为自己的程序猿生涯更上一层楼,就得知道什么是BUG调试,而且还必须知道怎么调好BUG.那么BUG究竟是什么呢?在我之前的一篇关于BUG的论述<朋友,请待你的朋友--BUG好一点!>已经说得很清楚了.BUG作为一类寄生于程序猿体内的"昆虫",其实它并不可怕.可怕的是,当我们捕获一只BUG时却不知怎么处理它. 1.对于HTML/CSS而言,如果页面布局出现了BUG,一般而言,这类BUG的攻击力最低.

2048小游戏-JS实现(BUG调试中)

刚刚学习JS的菜鸟,游戏没有实现滑动效果.希望有前辈能指点一下······ 定义的主要方法: 1.fuzhi()生成一对随机数,然后根据这对随机数取得一个随机单元格,先判断其是否为空,不为空,对其进行赋值为2的操作:为空,则再次调用fuzhi(). 2.secai()遍历表格,根据单元格的数值改变单元格的背景颜色. 3.score()遍历单元格,计算实时总得分. 4.keyDown()主要方法,根据用户按上下左右键来进行不同的数值相加.消除动作.这一段代码写得很冗余····· 1 <!DOCTY

关于cocos2dx程序的BUG调试解决方案

今天说一下手机游戏开发的调试问题吧.不得不说的是和PC平台游戏.软件开发相比,手机上开发游戏和软件要困难的多.原因是多方面的,比如说开发环境比较复杂,工具软件不够人性化等等. cocos2dx的出现解决了一个很大的问题,因为他是跨平台的,相对来说windows的软件开发环境比较友好,对中国程序员来说更熟悉.这样可以在windows进行日常开发和调试,然后在发布到其它平台的时候进行少量的处理就好了. cocos2dx程序的调试,在windows下和端游类似,可以在后台窗口进行打印,也可以直接在vs

调试JDK源代码-一步一步看HashMap怎么Hash和扩容

调试JDK源代码-一步一步看HashMap怎么Hash和扩容 调试JDK源代码-ConcurrentHashMap实现原理 调试JDK源代码-HashSet实现原理 调试JDK源代码-调试JDK源代码-Hashtable实现原理以及线程安全的原因 还是调试源代码最好. 开发环境  JDK1.8+NetBeans8.1 说明:调试HashMap的 public V put(K key, V value) 方法并查看key的值时不能显示变量的值,原因在于oracle提供的jre中rt.jar不带de

u-boot下延时程序失效的bug调试

最近在工作中的一个项目中,大概是将两块板卡相连(一块STM32跑裸机程序,另一块AM335x跑Linux系统),但是发现在u-boot有时无法启动成功,需要通过一个GPIO的状态来判断,具体来说就是本来上电后端口默认高阻抗,先利用程序先拉低大概100ms,然后在使用程序拉高100ms,然后STM32程序检测这段电平跳变,从而确定系统正确启动,否则会进行软件复位使AM335X的单板能够正常启动,程序本身并不难,但是调试时遇到了一个奇怪的bug,简单记录下. 平台:am335x,u-boot v20