首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

IT技术-基础篇 谈谈Java基本类型与封装类型踩过的几个坑

前言

现实生活中父母替孩子在生活中分担得太多就变成了溺爱,那么势必在孩子错误的接收后产生很多负面的影响,父母爱孩子而不是过度宠爱。

同样Java语言设计上开发者考虑的很全面,有的没的都替使用者操碎了心,我不是说开发工具包中设计有什么问题,而是在使用者未清楚目的或错误接收信息后,那么简直就是大型车祸现场。

下面聊一下实际开发中常出现的问题:

坑 -> 比较"=="

当我们进行两个基本类型的数值比较时会使用到固有写方法“==”符号,实际开发中针对封装类型也会出现”==“比较,但这是不正确的,因为封装类型已经上升为对象的概念,那么此时使用”==“比较时就变成了两个对象地址的比较,显然这是不是预期结果。

这个时候有人会说了你看我把ab的值都赋成1,两种方式都是true呀,没错,这就是要提的重点,如下图,没错开发者针对自动装箱(Integer.valueOf())为封装类型的Integer对象设置了缓存值,区间为-128~127。

原因嘛还是Java对象的概念,Integer由int通过封装相应属性及方法变为了对象,创建对象就是分配空间,开发者为了在使用者使用时减少对象产出来增加的缓存。

实际例子,我在一次排查生产BUG时,就遇到过同事写出的这种逻辑,导致只要订单金额超过127元,那么订单状态流转逻辑就执行不到。疫情在家办公,深夜的绝望,将同事的所有代码从头review到最后,在抽了一盒烟后,终于想起来这个问题,别说我菜,正常思维怎么也想不到这里去。

解决办法直接使用Integer重写的equals方法替代了“==“,根据其注解的说法是可以通过设置-XX:AutoBoxCacheMax=,但是这个size没有太好参考,当然根据自己业务场景进行设置,另有大神提出,文章赋上,有兴趣的可以看一下做为参考。

PS:除了Integer外Byte\Short\Long\Character均存在缓存区间,但只有Integer是可以自定义区间大小的,其它均为固定区间。

坑 -> 封装类型空指针异常

这个坑呢,还是每个人写代码上的注意问题,比如两个封装类型的值进行运算时,如果其中一个传了null,那么这个时候毋庸置疑的你将会收获空指针。

坑 -> 精度丢失

(int) (Double.valueOf("150.2") * 100)

上面的这个公式计算出来的结果是多少呢,15020?如果说是,那得重新定位下浮点类型数据的概念了,这个公式结果为15019,为什么浮点数可能丢失精度呢,因为计算机只认二进制,由十进制转成二进制时又会乘2,这时就有可能会无限循环,就如同10除以3除不尽得到3.33333…。

这个写法直接导致商户订单在退款时失败的结果,当我看到这个公式的时候真的是惊呆了,在这里提一下,涉及到钱的属性务必以分为单位,当然如果你仍希望元作为单位,那么Java也提供了BigInteger和BigDecimal等高精度运算类。

后话

工作中时常会因为不够了解底层的原理而导致问题频出,但这不是阻碍我们前进的绊脚石,学习永不过时,细致每个点,那么书写出来的代码一定不会差。问题消灭不了,只能最大程序的规避,遇到问题时也要以一种正确的心态去面对,要不然呢,BUG终归要解决不是?

明天唠一唠String,明见了您。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20221204A03BVT00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券