当前位置:首页 > 科技  > 软件

Java程序员易踩的坑及解析

来源: 责编: 时间:2024-03-18 09:42:57 263观看
导读作为Java程序员,在日常开发中经常会遇到一些低级错误或者难以理解的情况。以下2个常见的问题,涉及到Java的基础知识,这2个基础知识小坑90%以上的程序员都踩过1. ==号比较的坑在比较Integer类型的对象时,一些程序员小伙伴

作为Java程序员,在日常开发中经常会遇到一些低级错误或者难以理解的情况。以下2个常见的问题,涉及到Java的基础知识,这2个基础知识小坑90%以上的程序员都踩过u6J28资讯网——每日最新资讯28at.com

1. ==号比较的坑

在比较Integer类型的对象时,一些程序员小伙伴可能会使用==来判断它们是否相等。然而,这种用法并不总是正确的。例如,对于Integer对象,==比较的是对象的引用而非值,因此结果可能出乎意料。我们应该养成使用equals()方法来判断两个Integer对象是否相等的良好习惯u6J28资讯网——每日最新资讯28at.com

Integer status1 = new Integer(1);Integer status2 = new Integer(1);System.out.println(status1 == status2);

思考:返回结果是什么?u6J28资讯网——每日最新资讯28at.com

答案:falseu6J28资讯网——每日最新资讯28at.com

我们小伙伴会说了,Java不是中为了节省内存和提高性能,会对一定范围内的Integer对象进行缓存。范围默认是在 -128 到 127 之间,怎么没有生效?u6J28资讯网——每日最新资讯28at.com

我们来看一下Integer构造方法u6J28资讯网——每日最新资讯28at.com

public Integer(int value) {    this.value = value;}

发现在Integer构造方法中并没有使用缓存u6J28资讯网——每日最新资讯28at.com

思考:Integer缓存在哪里使用?u6J28资讯网——每日最新资讯28at.com

在Integer类的valueOf方法中u6J28资讯网——每日最新资讯28at.com

public static Integer valueOf(int i) {    if (i >= IntegerCache.low && i <= IntegerCache.high)        return IntegerCache.cache[i + (-IntegerCache.low)];    return new Integer(i);}

如果将代码修改为如下:u6J28资讯网——每日最新资讯28at.com

Integer status1 = 1;  Integer status2 = 1;  System.out.println(status1 == status2);

思考:返回结果是什么?u6J28资讯网——每日最新资讯28at.com

答案:trueu6J28资讯网——每日最新资讯28at.com

特别说明: Integer status1 = 1 会默认转换为Integer status1 = Integer.valueOf(1)u6J28资讯网——每日最新资讯28at.com

编码要养成良好习惯,尽量少用==判断两个Integer类型数据是否相等,而应该改成使用equals方法判断:u6J28资讯网——每日最新资讯28at.com

Integer status1 = new Integer(1);Integer status2 = new Integer(1);System.out.println(status1.equals(status2));

输出结果trueu6J28资讯网——每日最新资讯28at.com

2. BigDecimal的坑

在一些业务场景(比如:仓库数量,金额)需要设置成小数,此时字段类型应该定义成BigDecimal,而不是Double,避免丢失精度问题u6J28资讯网——每日最新资讯28at.com

Double amount1 = 0.02;  Double amount2 = 0.03;  System.out.println(amount2 - amount1);

思考:输出结果会是0.1?u6J28资讯网——每日最新资讯28at.com

答案:不是输出结果如下:u6J28资讯网——每日最新资讯28at.com

0.009999999999999998

原因如下:Double类型的两个参数相减会转换成二进制,Double有效位数为16位这就会出现存储小数位数不够的情况,这种情况下就会出现误差u6J28资讯网——每日最新资讯28at.com

将上面代码进行优化u6J28资讯网——每日最新资讯28at.com

BigDecimal amount1 = new BigDecimal(0.02);BigDecimal amount2 = new BigDecimal(0.03);System.out.println(amount2.subtract(amount1));

思考:结果会是0.1?不是的,输出结果如下:u6J28资讯网——每日最新资讯28at.com

0.0099999999999999984734433411404097569175064563751220703125

思考:BigDecimal为啥还是丢失精度?u6J28资讯网——每日最新资讯28at.com

查看BigDecimal构造方法,注释说明如下u6J28资讯网——每日最新资讯28at.com

/** * 将 a double 转换为 a BigDecimal ,它是 的二进制浮点值的精确十进制表示 double形式。返回 BigDecimal 的小数位数是最小值,因此 (10scale × val) 是整数。 * 笔记: * 此构造函数的结果可能有些不可预测。人们可能会假设用 Java 编写 new BigDecimal(0.1) 会创建一个 BigDecimal 完全等于 0.1(未缩放值为 1,小数位数为 1),但实际上它等于 0.1000000000000000000055511151231257827021181583404541015625。这是因为 0.1 不能完全表示为 a double (或者,就此而言,不能表示为任何有限长度的二进制分数)。因此,传递 给 构造函数的值并不完全等于 0.1,尽管外观如此。 * String另一方面,构造函数是完全可预测的:正如人们所期望的那样,写入new BigDecimal("0.1")会创建一个BigDecimal完全等于 0.1 的构造函数。因此,通常建议优先使用 String 构造函数而不是此构造函数。 * 当 必须将 a double 用作 的源BigDecimal时,请注意,此构造函数提供精确的转换;它不会给出与使用Double.toString(double)方法然后使用BigDecimal(String)构造函数将 转换为 double a String 相同的结果。若要获得该结果,请使用该staticvalueOf(double)方法。 * 参数: * val – double 要转换为 BigDecimal的值。 * 抛出: * NumberFormatException – 如果 val 是无限或 NaN。         */public BigDecimal(double val) {    this(val,MathContext.UNLIMITED);}

通过构造函数说明发现,使用BigDecimal构造函数初始化对象,也会丢失精度u6J28资讯网——每日最新资讯28at.com

思考:BigDecimal如何才能不丢失精度呢?u6J28资讯网——每日最新资讯28at.com

BigDecimal amount3 = new BigDecimal(String.valueOf(0.02));  BigDecimal amount4 = new BigDecimal(String.valueOf(0.03));  System.out.println(amount4.subtract(amount3));

使用BigDecimal.valueOf方法初始化BigDecimal类型参数,也能保证精度不丢失。在新版的阿里巴巴开发手册中,也推荐使用这种方式创建BigDecimal参数。u6J28资讯网——每日最新资讯28at.com

BigDecimal amount1 =  BigDecimal.valueOf(0.02);  BigDecimal amount2 =   BigDecimal.valueOf(0.03);  System.out.println(amount2.subtract(amount1));

本文链接:http://www.28at.com/showinfo-26-76569-0.htmlJava程序员易踩的坑及解析

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Redis锁被别人释放怎么办

下一篇: 智能座舱软件性能与可靠性的评估和改进

标签:
  • 热门焦点
  • 对标苹果的灵动岛 华为带来实况窗功能

    继苹果的灵动岛之后,华为也在今天正式推出了“实况窗”功能。据今天鸿蒙OS 4.0的现场演示显示,华为的实况窗可以更高效的展现出实时通知,比如锁屏上就能看到外卖、打车、银行
  • 轿车从天而降电动车主被撞身亡 超速抢道所致:现场视频让网友吵翻

    近日,上海青浦区法院判决轿车从天而降电动车主被撞身亡案,轿车车主被判有期徒刑一年。案件显示当时男子驾驶轿车在上海某路段行驶,前车忽然转弯提速超车,
  • Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • 只需五步,使用start.spring.io快速入门Spring编程

    步骤1打开https://start.spring.io/,按照屏幕截图中的内容创建项目,添加 Spring Web 依赖项,并单击“生成”按钮下载 .zip 文件,为下一步做准备。请在进入步骤2之前进行解压。图
  • 一文掌握 Golang 模糊测试(Fuzz Testing)

    模糊测试(Fuzz Testing)模糊测试(Fuzz Testing)是通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。可以用来发现应用程序、操作系统和网络协议等中的漏洞或
  • 自律,给不了Keep自由!

    来源 | 互联网品牌官作者 | 李大为编排 | 又耳 审核 | 谷晓辉自律能不能给用户自由暂时不好说,但大概率不能给Keep自由。近日,全球最大的在线健身平台Keep正式登陆港交所,努力
  • 猿辅导与新东方的两种“归途”

    作者|卓心月 出品|零态LT(ID:LingTai_LT)如何成为一家伟大企业?答案一定是对&ldquo;势&rdquo;的把握,这其中最关键的当属对企业战略的制定,且能够站在未来看现在,即使这其中的
  • 新电商三兄弟,“抖快红”成团!

    来源:价值研究所作 者:Hernanderz 随着内容电商的概念兴起,抖音、快手、小红书组成的&ldquo;新电商三兄弟&rdquo;成为业内一股不可忽视的势力,给阿里、京东、拼多多带去了巨大压
  • 华为Mate 60保护壳曝光:硕大后置相机模组 凸起程度有惊喜

    这段时间以来,关于华为新旗舰的爆料日渐密集。据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将
Top