千锋教育-做有情怀、有良心、有品质的职业教育机构

400-811-9990
手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

上海
  • 北京
  • 郑州
  • 武汉
  • 成都
  • 西安
  • 沈阳
  • 广州
  • 南京
  • 深圳
  • 大连
  • 青岛
  • 杭州
  • 重庆
当前位置:南京千锋IT培训  >  技术干货  >  记Integer等值比较的一个坑

记Integer等值比较的一个坑

来源:千锋教育
发布人:wjy
时间: 2023-02-27 17:09:11

  一.引言

  小伙伴都知道,只要我们写代码,必然就会有BUG的存在。所以解决BUG的过程会伴随程序员的一生,这就是一个无解的常态。在平时的学习和工作过程中,我们需要通过不断地实践和总结,从而形成一套属于自己的解决和处理BUG的成熟方案。之前建哥看到过论坛中有人这样评价一个程序员的水平:只会写代码不会解BUG,只能算是一个业余的程序员;会写代码又能解决一般的BUG,可以称为是一个初级的程序员;会写代码还能解决复杂的BUG,才算是一个高级的软件工程师。这说的尽管不完全正确,但确实有一定的道理,这充分体现了解决BUG的能力对一个软件工程师来说,具有能否在IT行业立足并长久发展下去的重要性。从这点来说建哥还是非常认同的,毕竟解决BUG的过程就是一个开发人员逐步成长并走向辉煌的过程。

  既然BUG是开发中无法避免的问题,那我们就没必要在心理上排斥它,而应该学会在学习和工作中和BUG和谐共存的本领。有些BUG出现后会抛出具体的异常信息,而有些BUG则隐藏的比较深,属于是逻辑上的错误,甚至还会出现一些只有通过更换版本或者重启电脑才能得到解决的问题。当然,也有很大一部分BUG是因为编程人员自身粗心所导致的。建哥认为只要保持一颗好的心态和足够的耐心,再结合调试工具、查看源码或从百度上查找等手段,大部分问题都是可以迎刃而解的。而且时间长了,还能在这个过程中不断的积累一些经验,可以更好的让我们去应对未来程序中出现的问题。

  下面建哥就给各位小伙伴分享一个我在辅导学员时碰到的奇葩问题,希望能给大家带来一些启示.

  二.BUG重现

  2.1 相关实体类

记Integer等值比较的一个坑1

记Integer等值比较的一个坑2

  2.2 业务代码

记Integer等值比较的一个坑3

  三. 执行结果及分析

  3.1 执行结果

记Integer等值比较的一个坑4

  3.2 结果分析

  相信看到这里,很多小伙伴就有疑问了,明明测试数据中是有类别编号为519对应类别信息的,为什么在循环比较判断中没有匹配到呢?

  通过IDE调试可以发现,在将1号商品小米手机的类别编号和所有类别的编号进行等值比较时,确实都没有进入到if语句体中。这就很奇怪了,为啥另一个商品又能找到对应的类别对象信息呢???

  最后通过查看Integer包装类的源码我们发现,Integer对象在创建时如果值在-128~127范围内【JDK考虑到这个范围内的整数出现的概率比较高】,则会直接从缓存数组中获取对象!也就是说这个范围内,无论代码中使用多少次,获取的都是同一个数据对象,而超出这个范围则每次都是创建新的对象。

记Integer等值比较的一个坑5-6

  四.解决方式

  ==比较运算符对两个JAVA对象进行相等比较,比较的是这两个对象的地址。根据上面的源码,我们不难得出Integer(12)和Integer(12)在内存中是同一个对象,因此比较的地址是相等的;而Integer(519)和Integer(519)在内存中是两个不同的对象【创建了两次,地址不同】,因此==比较的结果为不等,而我们的这个业务是希望按照它们的值进行是否相等的比较。

  解决方法:将==比较运算替换为调用对象的equals方法比较

记Integer等值比较的一个坑7

  代码修改后的运行结果:

记Integer等值比较的一个坑8

  这样两个商品都匹配到了对应的类别信息【问题解决!!!】

  五.总结一下

  这个问题如果只是单纯的看代码,我们很难发现问题所在。其实在开发中,我们经常会碰到类似的问题。我们认为某段代码执行的逻辑应该是这样的,但实际上因为我们忽略了底层的一些细小的机制或对原理了解的不透彻,造成程序运行时得到了一个我们所不期望的结果【关键还不能解释为什么会这样】。因此建哥希望大家在平时的学习和工作过程中,对知识点一定要注重原理注重细节,这样才能尽量避免在编写程序时出现一些错误的使用,或者尽可能少的出现一些我们无法解释的逻辑错误。

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。

猜你喜欢LIKE

三元运算符是什么?三元运算符怎么用

2023-06-20

Java常量是什么?

2023-06-14

保证Servlet线程安全的方法有哪些?

2023-06-05

最新文章NEW

什么是javascript?

2023-06-12

javascript常用正则

2023-04-20

用c语言编写爱心的代码

2023-04-14

相关推荐HOT

更多>>

快速通道 更多>>

最新开班信息 更多>>

网友热搜 更多>>